|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2018-05-16 18:24 UTC] arnowt at gmail dot com
Description:
------------
Портит исходный массив.
Проверял на версии v5.6 и v7.2
Test script:
---------------
$res=[1,2,3];
foreach($res as &$v){}
print_r($res);
foreach($res as $v){}
print_r($res);
Expected result:
----------------
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Actual result:
--------------
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Array
(
[0] => 1
[1] => 2
[2] => 2 //!!!!!!
)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Dec 16 04:00:01 2025 UTC |
Я знаю что такое ссылки и использую их по назначению. Просто упростил пример. В коде нет не единого присваивания, однако исходный массив изменяется. Понятно что баг можно обойти, например если оба раза использовать ссылку(&$v) пример: $res=[1,2,3]; foreach($res as &$v){} print_r($res); foreach($res as &$v){} print_r($res); ------------------------------- Array ( [0] => 1 [1] => 2 [2] => 3 ) Array ( [0] => 1 [1] => 2 [2] => 3 //теперь все ожидаемо )this is NOT a bug - your code is buggy - it's that simple <?php $array1 = [1, 2, 3]; $array2 = [5, 6, 7]; foreach($array1 as $key=>&$item) { } foreach($array2 as $key=>$item) { $item = "TEST $key"; } print_r($array1); print_r($array2); $item = 'JESUS'; print_r($array1); ?> _______________________ <?php $array1 = [1, 2, 3]; $array2 = [5, 6, 7]; foreach($array1 as $key=>&$item) { } unset($item); /** THIS IS THE FIX */ foreach($array2 as $key=>$item) { $item = "TEST $key"; } print_r($array1); print_r($array2); $item = 'JESUS'; print_r($array1); ?>