Как убедиться, что значение сбрасывается в цикле foreach в PHP?

Я писал простую страницу PHP, и было использовано несколько циклов foreach .

Вот сценарии:

 $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. 

И когда этот foreach заканчивается, я написал еще один цикл foreach в котором все значения в цикле foreach были такими же, как и в предыдущем foreach .

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

Я не уверен, что хорошая практика состоит в том, чтобы иметь две петли foreach с одинаковыми значениями и ключами.

Будут ли значения перезаписываться в первом цикле foreach ?

Все нормально, пока вы не начнете использовать ссылки, и тогда вы можете получить странное поведение, например:

 <?php $array = array(1,2,3,4); //notice reference & foreach ($array as & $item) { } $array2 = array(10, 11, 12, 13); foreach ($array2 as $item) { } print_r($array); 

Вывод:

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

Поскольку первый foreach оставляет $item в качестве ссылки на $array[3] , $array[3] последовательно устанавливается для каждого значения в $array2 .

Вы можете решить, что это будет делать unset($item) после первого foreach , который удалит ссылку, но на самом деле это не проблема в вашем случае , поскольку вы не используете ссылки с foreach.

Две заметки из документации foreach :

Примечание. Когда первый foreach запускается, внутренний указатель массива автоматически возвращается к первому элементу массива. Это означает, что вам не нужно вызывать reset() перед циклом foreach .

а также

Примечание. Если массив не указан, foreach работает с копией указанного массива, а не с самим массивом. foreach имеет некоторые побочные эффекты для указателя массива. Не полагайтесь на указатель массива во время или после foreach не перезагружая его .

Поскольку вы не пишете массив, только чтение из него и печать материала, никакие значения в массиве не будут изменены.

Вы можете сэкономить время, пройдя через массив дважды, делая это:

 $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"; } } 

Все, что вам нужно, это 1 цикл foreach.

Или еще более короткий подход к тому, что сказал Джон, заключается в следующем:

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

Это намного проще и быстрее, чем использование substr, поскольку вы уже используете цикл foreach. И постарайтесь не загрязнять его с помощью тонны операторов if, если вы это сделаете, лучше использовать оператор switch гораздо быстрее.

Приветствия 🙂