while tiempo recorrer multidimensional mismo for asociativo array php foreach

tiempo - Encuentre el último elemento de una matriz al usar un bucle foreach en PHP



recorrer array post php (28)

Estoy escribiendo un creador de consultas SQL usando algunos parámetros. En Java, es muy fácil detectar el último elemento de una matriz desde el interior del bucle for simplemente verificando la posición actual de la matriz con la longitud de la matriz.

for(int i=0; i< arr.length;i++){ boolean isLastElem = i== (arr.length -1) ? true : false; }

En PHP tienen índices no enteros para acceder a las matrices. Por lo tanto, debe iterar sobre una matriz utilizando un ciclo foreach. Esto se vuelve problemático cuando necesita tomar alguna decisión (en mi caso agregar o / y parámetro al generar una consulta).

Estoy seguro de que debe haber alguna forma estándar de hacer esto.

¿Cómo resuelves esto en PHP?


¿Por qué tan complicado?

foreach($input as $key => $value) { $ret .= "$value"; if (next($input)==true) $ret .= ","; }

¡Esto agregará a, detrás de cada valor excepto el último!



Aquí está mi solución: simplemente obtenga el recuento de su matriz, menos 1 (ya que comienzan en 0).

$lastkey = count($array) - 1; foreach($array as $k=>$a){ if($k==$lastkey){ /*do something*/ } }


Aquí hay otra manera de hacerlo:

$arr = range(1, 10); $end = end($arr); reset($arr); while( list($k, $v) = each($arr) ) { if( $n == $end ) { echo ''last!''; } else { echo sprintf(''%s '', $v); } }


Como su intención de encontrar el arreglo EOF es solo para el pegamento. Obtenga información sobre la táctica de abajo. No necesita requerir el EOF:

$given_array = array(''column1''=>''value1'', ''column2''=>''value2'', ''column3''=>''value3''); $glue = ''''; foreach($given_array as $column_name=>$value){ $where .= " $glue $column_name = $value"; //appending the glue $glue = ''AND''; } echo $where;

o / p:

column1 = value1 AND column2 = value2 AND column3 = value3


Cuando toEnd llega a 0 significa que está en la última iteración del ciclo.

$toEnd = count($arr); foreach($arr as $key=>$value) { if (0 === --$toEnd) { echo "last index! $value"; } }

El último valor todavía está disponible después del bucle, por lo que si solo quieres usarlo para más cosas después del bucle, es mejor:

foreach($arr as $key=>$value) { //something } echo "last index! $key => $value";

Si no desea tratar el último valor como bucles internos especiales. Esto debería ser más rápido si tiene matrices grandes. (Si reutiliza la matriz después del bucle dentro del mismo ámbito, primero debe "copiar" la matriz).

//If you use this in a large global code without namespaces or functions then you can copy the array like this: //$array = $originalArrayName; //uncomment to copy an array you may use after this loop //end($array); $lastKey = key($array); //uncomment if you use the keys $lastValue = array_pop($array); //do something special with the last value here before you process all the others? echo "Last is $lastValue", "/n"; foreach ($array as $key => $value) { //do something with all values before the last value echo "All except last value: $value", "/n"; } //do something special with the last value here after you process all the others? echo "Last is $lastValue", "/n";

Y para responder a su pregunta original "en mi caso para anexar o / y parámetro al crear consulta"; esto recorrerá todos los valores, luego los unirá a una cadena con "y" entre ellos pero no antes del primer valor o después del último valor:

$params = []; foreach ($array as $value) { $params[] = doSomething($value); } $parameters = implode(" and ", $params);


Entonces, si su matriz tiene valores de matriz únicos, entonces la determinación de la última iteración es trivial:

foreach($array as $element) { if ($element === end($array)) echo ''LAST ELEMENT!''; }

Como puede ver, esto funciona si el último elemento aparece una sola vez en la matriz; de lo contrario, se genera una falsa alarma. En este caso, debe comparar las claves (que son únicas).

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

También tenga en cuenta el estricto operador de coparisión, que es bastante importante en este caso.


Esta debería ser la manera más fácil de encontrar el último elemento:

foreach ( $array as $key => $a ) { if ( end( array_keys( $array ) ) == $key ) { echo "Last element"; } else { echo "Just another element"; } }

Referencia: Link


Me gusta un poco lo siguiente ya que creo que es bastante limpio. Supongamos que estamos creando una cadena con separadores entre todos los elementos: por ejemplo, a, b, c

$first = true; foreach ( $items as $item ) { $str = ($first)?$first=false:", ".$item; }


Otra forma de hacerlo es recordar el resultado del ciclo de ciclo anterior y usarlo como resultado final:

$result = $where = ""; foreach ($conditions as $col => $val) { $result = $where .= $this->getAdapter()->quoteInto($col.'' = ?'', $val); $where .= " AND "; } return $this->delete($result);


Para los scripts de generación de consultas SQL, o cualquier cosa que realice una acción diferente para el primer o último elemento, es mucho más rápido (casi el doble de rápido) evitar el uso de comprobaciones de variables innecesarias.

La solución aceptada actualmente utiliza un ciclo y una verificación dentro del ciclo que se realizará cada_tarea_solital, la forma correcta (rápida) de hacerlo es la siguiente:

$numItems = count($arr); $i=0; $firstitem=$arr[0]; $i++; while($i<$numItems-1){ $some_item=$arr[$i]; $i++; } $last_item=$arr[$i]; $i++;

Un pequeño punto de referencia hecho en casa mostró lo siguiente:

test1: 100000 ejecuciones del modelo morg

tiempo: 1869.3430423737 milisegundos

test2: 100000 ejecuciones de modelo si es el último

tiempo: 3235.6359958649 milisegundos


Parece que quieres algo como esto:

$numItems = count($arr); $i = 0; foreach($arr as $key=>$value) { if(++$i === $numItems) { echo "last index!"; } }

Dicho esto, no tienes que-iterar sobre una "matriz" usando foreach en php.


Puede obtener el último índice por:

$numItems = count($arr);

echo $arr[$numItems-1];


Puede obtener el valor de la última clave de la matriz usando end(array_keys($array)) y compararla con la clave actual:

$last_key = end(array_keys($array)); foreach ($array as $key => $value) { if ($key == $last_key) { // last element } else { // not last element } }


Si necesita hacer algo para cada elemento, excepto el primero o el último, y solo si hay más de un elemento en el conjunto, prefiero la siguiente solución.

Sé que hay muchas soluciones más arriba y publicado meses / un año antes que las mías, pero esto es algo que siento que es bastante elegante en sí mismo. El control de cada ciclo también es una verificación booleana en lugar de una verificación numérica "i = (recuento-1)", que puede permitir una menor sobrecarga.

La estructura del bucle puede parecer incómoda, pero puede compararla con el orden de thead (principio), tfoot (final), tbody (actual) en etiquetas de tabla HTML.

$first = true; foreach($array as $key => $value) { if ($first) { $first = false; // Do what you want to do before the first element echo "List of key, value pairs:/n"; } else { // Do what you want to do at the end of every element // except the last, assuming the list has more than one element echo "/n"; } // Do what you want to do for the current element echo $key . '' => '' . $value; }

Por ejemplo, en términos de desarrollo web, si desea agregar un borde inferior a cada elemento excepto el último en una lista desordenada (ul), entonces puede agregar un borde superior a cada elemento excepto el primero (el CSS: first-child, compatible con IE7 + y Firefox / Webkit, admite esta lógica, mientras que: last-child no es compatible con IE7).

También puede reutilizar la primera variable $ para cada bucle anidado y las cosas funcionarán bien ya que cada bucle hace $ first false durante el primer proceso de la primera iteración (por lo que las interrupciones / excepciones no causarán problemas) .

$first = true; foreach($array as $key => $subArray) { if ($first) { $string = "List of key => value array pairs:/n"; $first = false; } else { echo "/n"; } $string .= $key . ''=>(''; $first = true; foreach($subArray as $key => $value) { if ($first) { $first = false; } else { $string .= '', ''; } $string .= $key . ''=>'' . $value; } $string .= '')''; } echo $string;

Ejemplo de salida:

List of key => value array pairs: key1=>(v1_key1=>v1_val1, v1_key2=>v1_val2) key2=>(v2_key1=>v2_val1, v2_key2=>v2_val2, v2_key3=>v2_val3) key3=>(v3_key1=>v3_val1)


Si te entiendo, todo lo que necesitas es invertir la matriz y obtener el último elemento con un comando pop:

$rev_array = array_reverse($array); echo array_pop($rev_array);


Suponiendo que tiene la matriz almacenada en una variable ...

foreach($array as $key=>$value) { echo $value; if($key != count($array)-1) { echo ", "; } }


También podrías hacer algo como esto:

end( $elements ); $endKey = key($elements); foreach ($elements as $key => $value) { if ($key == $endKey) // -- this is the last item { // do something } // more code }


También puede intentar esto para hacer su consulta ... que se muestra aquí con INSERTAR

<?php $week=array(''one''=>''monday'',''two''=>''tuesday'',''three''=>''wednesday'',''four''=>''thursday'',''five''=>''friday'',''six''=>''saturday'',''seven''=>''sunday''); $keys = array_keys($week); $string = "INSERT INTO my_table (''"; $string .= implode("'',''", $keys); $string .= "'') VALUES (''"; $string .= implode("'',''", $week); $string .= "'');"; echo $string; ?>


Tengo una fuerte sensación de que en la raíz de este "problema XY" el OP solo quería la función implode() .


Tengo una solución generalizada que uso, con el propósito común de compilar una cadena a partir de una matriz de valores de cadena. Todo lo que hago es agregar una cadena inusual al final y luego reemplazarla.

Función para devolver una cadena de una matriz, separada, sin separador final:

function returnArraySeparated($aArr, $sSep, $sAdd = "@X@") { $strReturn = (string) ""; # Compile the set: foreach ($aArr as $sItem) { $strReturn .= $sItem . $sSep; } # Easy strip the end: $strReturn = str_replace($sSep . $sAdd, "", $strReturn . $sAdd); return $strReturn; }

Nada especial, pero funciona :)


Todavía puede usar ese método con matrices asociativas:

$keys = array_keys($array); for ($i = 0, $l = count($array); $i < $l; ++$i) { $key = $array[$i]; $value = $array[$key]; $isLastItem = ($i == ($l - 1)); // do stuff } // or this way... $i = 0; $l = count($array); foreach ($array as $key => $value) { $isLastItem = ($i == ($l - 1)); // do stuff ++$i; }


Una forma podría ser detectar si el iterador tiene next . Si no hay un próximo adjunto al iterador, significa que está en el último ciclo.

foreach ($some_array as $element) { if(!next($some_array)) { // This is the last $element } }


Ya hay muchas respuestas, pero también vale la pena examinar los iteradores, especialmente porque se lo solicitó de forma estándar:

$arr = range(1, 3); $it = new CachingIterator(new ArrayIterator($arr)); foreach($it as $key => $value) { if (!$it->hasNext()) echo ''Last:''; echo $value, "/n"; }

Es posible que encuentre algo que también funcione de manera más flexible para otros casos.


Yo personalmente uso este tipo de construcción que permite un uso fácil con elementos html <ul> y <li>: simplemente cambie la igualdad de otra propiedad ...

La matriz no puede contener elementos falsos, sino todos los demás elementos que se arrojan al falso booleano.

$table = array( ''a'' , ''b'', ''c''); $it = reset($table); while( $it !== false ) { echo ''all loops'';echo $it; $nextIt = next($table); if ($nextIt === false || $nextIt === $it) { echo ''last loop or two identical items''; } $it = $nextIt; }


puedes hacer un conteo ().

for ($i=0;$i<count(arr);$i++){ $i == count(arr)-1 ? true : false; }

o si solo está buscando el último elemento, puede usar end ().

end(arr);

devuelve solo el último elemento.

y, como resultado, PUEDE indexar arrays php por enteros. Es perfectamente feliz con

arr[1];


Parece que quieres algo como esto:

$array = array( ''First'', ''Second'', ''Third'', ''Last'' ); foreach($array as $key => $value) { if(end($array) === $value) { echo "last index!" . $value; } }


<?php foreach($have_comments as $key => $page_comment): ?> <?php echo $page_comment;?> <?php if($key+1<count($have_comments)): ?> <?php echo '', ''; ?> <?php endif;?> <?php endforeach;?>