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