foreach上的PHP数组强制转换;t通过引用传递变量


PHP array cast on foreach doesn't pass variable by reference

请考虑此测试:

$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_。