2015-11-22 45 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是不一樣的。