Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP将引用从一个数组复制到另一个数组_Php_Arrays - Fatal编程技术网

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

PHP将引用从一个数组复制到另一个数组,php,arrays,Php,Arrays,代码: 结果: $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); 为什么$b的内容不是$a每个元素的引用? 我对$b的期望应该是{&a[0]、&a[1]、&a[2]},而不是{&a[2

代码:

结果:

$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);
为什么$b的内容不是$a每个元素的引用?
我对$b的期望应该是{&a[0]、&a[1]、&a[2]},而不是{&a[2]、&a[2]、&a[2]}

foreach
循环中,您将新数组
$b
的每个元素设置为引用变量
$v
。因此在
foreach
循环的末尾,它们都指向
$v
的最后/当前值,即“2017-10-6”

您可以通过以下方式引用数组
$a
中的项:

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"
}
像这样的参考

foreach($a as $k => $var){
    $b[] = &$a[$k];
}
现场演示:

如果
$a[“email”]=“test”将其影响自动更改为
$b


现场演示:

这是visa versa的参考资料。a的每个元素引用b的每个元素。而反向引用也很重要

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

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

<?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);
致命错误:键元素不能是引用

有人能给我解释一下为什么不能把钥匙作为参考吗?

因为语言不支持这一点。在大多数语言中,你很难找到这种能力,因此术语键

我是不是被这样的事情缠住了?

对。最好的方法是使用适当的键创建一个新数组

还有其他选择吗?

提供更好的替代方案的唯一方法是了解您的具体情况。如果键映射到表列名,那么最好的方法是保持键的原样,并在SQL中使用键时对其进行转义

关于:

参考仅对价值有用

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

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

哇,我喜欢这个解释。看起来根本原因是每次foreach中的$v实际上都是相同的变量空间,而不是一个全新的变量。对于通常的“按值传递”情况,它可以正常工作,但对于“按引用传递”,它会导致意外情况,除非编码人员对此有更好的理解。
<?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
)