Как убедиться, что значение 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 гораздо быстрее.

Приветствия:)