Как убедиться, что значение reset в цикле 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
?
Ответы
Ответ 1
Это нормально, пока вы не начнете использовать ссылки, а затем вы можете получить странное поведение, например:
<?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.
Ответ 2
Две заметные заметки из документации foreach
:
Примечание. При первом запуске foreach
, указатель внутреннего массива автоматически reset для первого элемента массива. Это означает, что вам не нужно вызывать reset()
перед циклом foreach
.
и
Примечание. Если массив не указан, foreach
работает в копии указанного массива, а не самого массива. foreach
имеет некоторые побочные эффекты для указателя массива. Не полагайтесь на указатель массива во время или после foreach
без его сброса.
Ответ 3
Поскольку вы не пишете массив, только чтение из него и печать материала, никакие значения в массиве не будут изменены.
Вы можете сэкономить время на цикл через массив дважды, выполнив следующее:
$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";
}
}
Ответ 4
Все, что вам нужно, это 1 цикл foreach.
Или даже более короткий подход к тому, что сказал Джон, заключается в следующем:
$arrs = array("a", "b", "c");
foreach ($arrs as $arr)
if ($arr != "a")
echo 'This is ' . $arr;
Это намного проще и быстрее, чем использование substr, поскольку вы уже используете цикл foreach. И постарайтесь не загрязнять его с помощью тонов инструкций if, если вы это сделаете, лучше использовать оператор switch гораздо быстрее.
Приветствия:)