2017-10-07 119 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