¿Cómo puedo asegurarme de que el valor se restablece en un bucle ‘foreach’ en PHP?

Estaba escribiendo una página PHP simple y se usaron algunos bucles foreach .

Aquí están los guiones:

 $arrs = array("a", "b", "c"); foreach ($arrs as $arr) { if(substr($arr,0,1)=="b") { echo "This is b"; } } // End of first 'foreach' loop, and I didn't use 'ifelse' here. 

Y cuando termina este foreach , escribí otro ciclo foreach en el que todos los valores del bucle foreach eran los mismos que en el anterior foreach .

 foreach ($arrs as $arr) { if(substr($arr,0,1)=="c") { echo "This is c"; } } 

No estoy seguro de si es una buena práctica tener dos bucles foreach con los mismos valores y claves.

¿Los valores se sobrescribirán en el primer ciclo foreach ?

Está bien hasta que comienzas a utilizar referencias y luego puedes obtener un comportamiento extraño, por ejemplo:

  

Salidas esto:

 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 13 ) 

Como el primer foreach deja $item como referencia a $array[3] , $array[3] se establece secuencialmente para cada valor en $array2 .

Puede resolver esto haciendo unset($item) después del primer foreach , que eliminará la referencia, pero esto no es realmente un problema en su caso , ya que no está utilizando referencias con foreach.

Dos notas notables de la documentación de foreach :

Nota: Cuando foreach comienza a ejecutarse, el puntero de la matriz interna se restablece automáticamente al primer elemento de la matriz. Esto significa que no necesita llamar a reset() antes de un ciclo foreach .

y

Nota: A menos que se haga referencia a la matriz, foreach opera en una copia de la matriz especificada y no en la misma matriz. foreach tiene algunos efectos secundarios en el puntero del array. No confíe en el puntero de matriz durante o después del foreach sin restablecerlo .

Como no está escribiendo en la matriz, solo leyendo e imprimiendo cosas, no se cambiarán los valores de la matriz.

Sin embargo, puede ahorrar tiempo haciendo un bucle en la matriz dos veces al hacer esto:

 $arrs = array("a", "b", "c"); foreach ($arrs as $arr) { if(substr($arr,0,1)=="b") { echo "This is b"; } if(substr($arr,0,1)=="c") { echo "This is c"; } } 

Todo lo que necesitas es 1 bucle foreach.

O un enfoque aún más corto para lo que dijo Jon, es este:

 $arrs = array("a", "b", "c"); foreach ($arrs as $arr) if ($arr != "a") echo 'This is ' . $arr; 

Esto es mucho más fácil y rápido que usar substr, ya que ya está utilizando un bucle foreach. Y trate de no contaminarlo con una tonelada de declaraciones if, si se encuentra haciendo esto, es mejor usar una statement de cambio, mucho más rápido.

Saludos 🙂