Я писал простую страницу 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 гораздо быстрее.
Приветствия 🙂