2017-10-07 229 views
4

代碼:PHP從陣列複製參考陣列

$a = array('email'=>'[email protected]','topic'=>'welcome onboard','timestamp'=>'2017-10-6'); 

$b = array(); 
foreach($a as $v){ 
    $b[] = &$v; 
} 

var_dump($a); 
var_dump($b); 

結果:

array(3) { 
    ["email"]=> 
    string(11) "[email protected]" 
    ["topic"]=> 
    string(15) "welcome onboard" 
    ["timestamp"]=> 
    string(9) "2017-10-6" 
} 
array(3) { 
    [0]=> 
    &string(9) "2017-10-6" 
    [1]=> 
    &string(9) "2017-10-6" 
    [2]=> 
    &string(9) "2017-10-6" 
} 

爲什麼$ B的含量不是$一個各元素的引用? 我預期$ B的應該是什麼樣{&一個[0],&一個[1],& A [2]}代替{&一個[2],&一個[2],& A [2]}

+0

它看起來像的根源是的foreach每次$ V實際上是同一個變量空間,而不是一個全新的變量。對於通常情況下的價值傳遞情況,它可以正常工作,但對於'通過引用'來說,它會導致意想不到的情況,除非編碼人員對此有更好的理解。 – Orange

回答

3

即使我有錯誤,當我試圖引用關鍵

$a = array('email'=>'[email protected]','topic'=>'welcome onboard','timestamp'=>'2017-10-6'); 

$b = array(); 
foreach($a as &$key=>&$v){ 
    $b[] = &$v; 
} 

Fatal error: Key element cannot be a reference

有人能向我解釋爲什麼你不能傳遞一個關鍵作爲參考?

因爲語言不支持這個。你很難在大多數語言中找到這種能力,因此稱爲關鍵詞。

所以我堅持這樣的東西?

是的。最好的方法是用適當的鍵創建一個新的數組。

任何替代品?

提供更好替代品的唯一方法是瞭解您的具體情況。如果您的鍵映射到表列名稱,那麼最好的方法是將鍵保留原樣並在您的SQL中使用時將其轉義。

回覆: Alternatives to Pass both Key and Value By Reference:

參考僅適用於價值

<?php 

$a = array('email'=>'[email protected]','topic'=>'welcome onboard','timestamp'=>'2017-10-6'); 

$b = array(); 
foreach($a as $key=>&$v){ 
    $b[] = &$v; 
} 
echo "<pre>"; 
print_r($a); 
echo "</pre>";echo "<pre>"; 
print_r($b); 

輸出將被

Array 
(
    [email] => [email protected] 
    [topic] => welcome onboard 
    [timestamp] => 2017-10-6 
) 
Array 
(
    [0] => [email protected] 
    [1] => welcome onboard 
    [2] => 2017-10-6 
) 
+0

哇,我喜歡這個解釋。 – C2486

2

in foreach loop,您將新數組$b的每個元素設置爲引用變量$v。所以在foreach循環結束時,它們都指向最後/當前值$v,即「2017-10-6」。

可以參考陣列$a這樣的elaments:

foreach($a as $k => $var){ 
    $b[] = &$a[$k]; 
} 
0

這是反之亦然引用。 b的每個元素的引用的每個元素。反向參照也是。

<?php 
$a = 
array('email'=>'[email protected]','topic'=>'welcome 
onboard','timestamp'=>'2017-10-6'); 
$b = array(); 
foreach($a as &$v){ 
    $b[] = &$v; 
} 
    $b[2]='11'; //make changes in any element, 
    //will reflect both array 
    var_dump($a); 
    var_dump($b); 

這裏的工作演示:https://ideone.com/icgVJY