PHP ¿Cómo determinar la primera y última iteración en un bucle foreach?

Resuelto mehdi asked hace 54 años • 21 respuestas

La pregunta es sencilla. Tengo un foreachbucle en mi código:

foreach($array as $element) {
    //code
}

En este ciclo, quiero reaccionar de manera diferente cuando estemos en la primera o última iteración.

¿Como hacer esto?

mehdi avatar Jan 01 '70 08:01 mehdi
Aceptado

Si prefiere una solución que no requiera la inicialización del contador fuera del bucle, puede comparar la clave de iteración actual con la función que le indica la última/primera clave de la matriz.

PHP 7.3 y más reciente:

foreach ($array as $key => $element) {
    if ($key === array_key_first($array)) {
        echo 'FIRST ELEMENT!';
    }

    if ($key === array_key_last($array)) {
        echo 'LAST ELEMENT!';
    }
}

PHP 7.2 y mayores:

PHP 7.2 ya está en EOL (fin de vida), por lo que esto está aquí solo como referencia histórica. Evitar el uso de.

foreach ($array as $key => $element) {
    reset($array);
    if ($key === key($array)) {
        echo 'FIRST ELEMENT!';
    }

    end($array);
    if ($key === key($array)) {
        echo 'LAST ELEMENT!';
    }
}
Rok Kralj avatar Jan 08 '2012 20:01 Rok Kralj

Podrías usar un contador:

$i = 0;
$len = count($array);
foreach ($array as $item) {
    if ($i == 0) {
        // first
    } else if ($i == $len - 1) {
        // last
    }
    // …
    $i++;
}
Gumbo avatar Jul 01 '2009 17:07 Gumbo

Para encontrar el último elemento, encuentro que este código funciona siempre:

foreach( $items as $item ) {
    if( !next( $items ) ) {
        echo 'Last Item';
    }
}
Yojance avatar Aug 16 '2014 17:08 Yojance

Una versión más simplificada de lo anterior y suponiendo que no estás usando índices personalizados...

$len = count($array);
foreach ($array as $index => $item) {
    if ($index == 0) {
        // first
    } else if ($index == $len - 1) {
        // last
    }
}

Versión 2: porque he llegado a detestar el uso de else a menos que sea necesario.

$len = count($array);
foreach ($array as $index => $item) {
    if ($index == 0) {
        // first
        // do something
        continue;
    }

    if ($index == $len - 1) {
        // last
        // do something
        continue;
    }
}
Hayden avatar Dec 11 '2010 08:12 Hayden