Почему я не могу отключить переменную в цикле foreach
?
<?php $array = array(a,s,d,f,g,h,j,k,l); foreach($array as $i => $a){ unset($array[1]); echo $a . "\n"; } print_r($array);
с<?php $array = array(a,s,d,f,g,h,j,k,l); foreach($array as $i => $a){ unset($array[1]); echo $a . "\n"; } print_r($array);
В коде переменная находится в области видимости внутри цикла foreach
, но вне цикла она не установлена. Можно ли отключить его в цикле?
Вам нужно передать массив по ссылке, например:
foreach($array as $i => &$a){
Обратите внимание на добавленную &
. Это также указано в руководстве foreach :
Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед значением $ value нужно указать &. В этом случае значение будет присвоено по ссылке.
Теперь это производит :
a d f g h j k l Array ( [0] => a [2] => d [3] => f [4] => g [5] => h [6] => j [7] => k [8] => l )
foreach
выполняется на копии массива, а не на ссылке, чтобы было легче справляться с более резкими изменениями в массиве (например, вашими) во время выполнения.
foreach
выполняет итерацию по массиву и назначает ключ $ i и значение $ a перед доступом к кодовому блоку внутри цикла. Массив фактически «скопирован» функцией перед повторением, поэтому любые изменения исходного массива не влияют на прогрессию цикла.
Вы также можете передать массив $ по ссылке в foreach, используя $i => &$a
вместо значения, которое позволит мутации массива.
Другим вариантом было бы работать непосредственно с массивом, и вы увидите что-то другое:
for($x=0;$x<count($array);$x++){ unset($array[1]); // for $x=1 this would result in an error as key does not exist now echo $array[$x]; } print_r($array);
сfor($x=0;$x<count($array);$x++){ unset($array[1]); // for $x=1 this would result in an error as key does not exist now echo $array[$x]; } print_r($array);
Конечно, это предполагает, что ваш массив численно и последовательно.