在foreach上强制转换的PHP数组不会通过引用传递变量

时间:2015-11-22 17:26:01

标签: php arrays foreach casting

请考虑此测试:

$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)上运行

1 个答案:

答案 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不一样。