PHP将数组中的引用复制到另一个数组

4

代码:

$a = array('email'=>'orange@test','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) "orange@test"
  ["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的内容为什么不是$a每个元素的引用?我期望的$b应该是这样的{&a[0],&a[1],&a[2]},而不是{&a[2],&a[2],&a[2]}


看起来问题的根本原因是foreach中的每个$v实际上都是同一个变量空间,而不是全新的变量。对于通常的“传值”情况,它可以正常工作,但对于“传引用”,除非程序员对此有更好的理解,否则会导致意外情况。 - Orange
4个回答

3

当我尝试引用密钥时,甚至出现了错误

$a = array('email'=>'orange@test','topic'=>'welcome onboard','timestamp'=>'2017-10-6');

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

致命错误:关键元素不能是引用

有人能解释一下为什么不能将关键字作为引用传递吗?

因为语言不支持此功能。在大多数语言中,很难找到这种能力,因此使用术语“关键字”。

那我只能像这样做吗?

是的。最好的方法是创建一个带有适当关键字的新数组。

还有其他选择吗?

提供更好的替代方案的唯一方法是了解您的具体情况。如果您的关键字映射到表列名称,则最佳方法是保留关键字,并在使用它们的SQL时对它们进行转义。

Re: 通过引用传递关键字和值的替代方法:

引用仅适用于值

<?php

$a = array('email'=>'orange@test','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] => orange@test
    [topic] => welcome onboard
    [timestamp] => 2017-10-6
)
Array
(
    [0] => orange@test
    [1] => welcome onboard
    [2] => 2017-10-6
)

哇,我喜欢这个解释。 - Niklesh Raut

2
foreach 循环中,你将新数组 $b 的每个元素设置为引用变量 $v。因此,在循环结束时,它们都指向最后/当前的 $v 值,即“2017-10-6”。
你可以通过以下方式引用数组 $a 的元素:
foreach($a as $k => $var){
    $b[] = &$a[$k];
}

0

0

这里是相互引用。每个元素都引用了b中的每个元素。反向引用也是如此。

<?php
$a =   
array('email'=>'orange@test','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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接