2012-06-28 3 views
4

Почему я не могу отключить переменную в цикле foreach?Почему я не могу отключить переменную в цикле `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); 

В the code, переменная находится в области видимости внутри цикла foreach, но вне цикла, это не установлено. Можно ли отключить его в цикле?

+7

В значительной степени каждый язык программирования - это плохая идея изменить коллекцию, итерации по ней. –

+1

Насколько я помню, вам нужно установить массив по ссылке: 'foreach (& $ array as $ i => $ a) {' –

+0

возможный дубликат [Unset a array element внутри цикла foreach] (http: // stackoverflow .com/questions/3054886/unset-a-array-element-inside-a-foreach-loop) –

ответ

8

Вам нужно передать массив по ссылке, например, так:

foreach($array as $i => &$a){ 

Примечание добавленный &. Это также указано в руководстве по foreach:

Для того, чтобы иметь возможность напрямую изменять элементы массива в пределах контура предшествуют $ значения с &. В этом случае значение будет присвоено ссылкой .

Сейчас это produces:

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 
) 
4

foreach выполняет на копию массива, а не ссылкой, чтобы сделать его легче иметь дело с более резкими изменениями в массиве (например, как ваша) в течение выполнение.

2

Итерирует по массиву и назначает ключ $ 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); 

Конечно, это предполагает, что ваш массив численно и последовательно ключом.

Смежные вопросы