2016-04-08 4 views
0

Я столкнулся с чем-то странным, надеюсь кто-то может объяснить, что происходит. Я варил вниз к следующему случаю для воспроизведения на PHP версии 5.3.10-1ubuntu3.21:PHP массив по ссылке сохраняется

$lines = array("foo" => "bar"); 

foreach ($lines as &$line) { } // Trouble-causer 

$temp = $lines; 

foreach ($lines as $key => $line) { 
    $lines[$key] = "test"; 
} 
print_r($lines); 
print_r($temp); 

Ожидаемый результат этого, так как я не работаю на $temp, является

Array 
(
    [foo] => test 
) 
Array 
(
    [foo] => bar 
) 

Но фактический результат

Array 
(
    [foo] => test 
) 
Array 
(
    [foo] => test 
) 

Если удалить строку, отмеченную Trouble-causer он работает, как ожидалось. Каким-то образом тот факт, что я включил $lines пунктов по ссылке, сохраняется в следующей итерации. Этого можно ожидать?

+0

ваш фактический результат irrelevent, так как у вас есть те же самые ключевые в 2 раза! –

ответ

2

Документация foreach сказать:

Предупреждение референции $value и последний элемент массива остается даже после цикла foreach. Рекомендуется уничтожить его на unset().

foreach ($lines as &$line) { } // Trouble-causer 
unset($line); 
+0

Спасибо! Я пропустил этот бит. Однако очень странное поведение, но, по крайней мере, сейчас я знаю об этом. – MaX

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