请考虑此测试:
$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是由ref传递的。 我在“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之外用一个单独的命令解决了施法,但我的问题是:
这是一个错误吗?
此测试在PHP 5.6.14版(apache-2.4 windows-10)上运行
答案 0 :(得分:1)
将某个变量转换为其他类型(甚至相同)意味着创建另一个变量。
所以如果你有:
$data = []; // some array here
然后根据php-manual执行(array)$data
(与array($data)
相同)意味着你有新的变量,所以你的:
foreach ((array)$data as &$iter)
不适用于$data
变量,但适用于其他变量,但仍与$data
具有相同的值。
所以,你应该明确地转向array
:
$data = (array)$data;
foreach ($data as &$iter) {
// do some stuff
}
正如手册所说:
数组赋值总是涉及值复制。
因此$data
和(array)$data
不一样。