2015-11-22 44 views
1

请考虑一下测试:投下的foreach PHP数组不通过引用传递变量

$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被ref传递的原因。 我在“foreach”中设置了强制转换,以确保通过foreach语句可以接受没有错误的空/空变量。

正如你在输出中看到的那样,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窗口-10)

+1

铸造值可以是与变量内部值不同的值。所以,如果它*会工作,它会隐含分配:'$变量=(数组)$变量;'。 – Rizier123

+0

好的,但不同的值意味着不同的参考? – Tobia

+1

对于数组是的。 –

回答

0

运行铸造一些变量其它类型(甚至相同的)指的是另一变量被创建。

所以,如果您有:

$data = []; // some array here 

然后做(array)$data(什么是一样的array($data)根据的PHP手册)意味着你有新的变量,所以你:

foreach ((array)$data as &$iter) 

作品不与$data变量,但与其他一些变量,仍然具有相同的值作为您的$data

所以,你应该明确地转换为array

$data = (array)$data; 
foreach ($data as &$iter) { 
    // do some stuff 
} 

正如说明书上说:

数组赋值总是涉及值复制。

所以你的$data(array)$data是不一样的。