请考虑此测试:
$data=[["id"=>1,"text"=>"One"],["id"=>2,"text"=>"Two"]];
foreach((array)$data as &$iter)
$iter["append"]=true;
print_r($data);
这是输出
Array
(
[0] => Array
(
[id] => 1
[text] => One
)
[1] => Array
(
[id] => 2
[text] => Two
)
)
我想对一个数组进行iter,并在关联数组中添加另一个键,这就是引用传递$iter的原因。我在"foreach"中设置了强制转换,以确保foreach语句可以接受空/null变量而不会出错。
正如您在输出中看到的,foreach没有附加值,但如果我移除强制转换,它就可以工作。
foreach($data as &$iter)
$iter["append"]=true;
print_r($data);
这是(右侧)输出
Array
(
[0] => Array
(
[id] => 1
[text] => One
[append] => 1
)
[1] => Array
(
[id] => 2
[text] => Two
[append] => 1
)
)
我在foreach之外用一个单独的命令解决了选角问题,但我的问题是:
这是个bug吗
此测试在PHP版本5.6.14(apache-2.4 windows-10)
将某个变量转换为其他类型(甚至相同)意味着创建了另一个变量。
所以,如果你有:
$data = []; // some array here
然后执行(array)$data
(根据php手册,与array($data)
相同)意味着您有了新的变量,因此您的:
foreach ((array)$data as &$iter)
不适用于$data
变量,但适用于其他一些变量,这些变量仍然具有与$data
相同的值。
因此,您应该显式转换为array
:
$data = (array)$data;
foreach ($data as &$iter) {
// do some stuff
}
正如手册所说:
数组赋值总是涉及到值复制。
所以你的CCD_ 6和CCD_。