【问题标题】:PHP copy reference from array to arrayPHP 将引用从数组复制到数组
【发布时间】:2017-10-07 02:33:48
【问题描述】:

代码:

$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 实际上都是相同的变量空间,而不是一个全新的变量。对于通常“按值传递”的情况,它可以正常工作,但对于“通过引用”,它会导致意外情况,除非编码人员对此有更好的理解。

标签: php arrays


【解决方案1】:

即使我在尝试引用密钥时也遇到了错误

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

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

致命错误:关键元素不能作为参考

谁能向我解释为什么你不能将密钥作为参考传递?

因为语言不支持这个。您很难在大多数语言中找到这种能力,因此使用了术语键。

那么我是否被这样的事情困扰?

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

还有其他选择吗?

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

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

参考只对价值起作用

<?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
)

【讨论】:

  • 哇,我喜欢这个解释。
【解决方案2】:

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

你可以这样引用数组$a的元素:

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

【讨论】:

    【解决方案3】:

    这样引用

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

    现场演示:https://eval.in/875570

    如果$a["email"] = "test"; 更改它会自动影响到$b

    现场演示:https://eval.in/875571

    【讨论】:

      【解决方案4】:

      这里是反之亦然的参考。 a的每个元素引用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

      【讨论】:

        猜你喜欢
        • 2021-12-09
        • 2013-03-05
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 2017-07-08
        • 1970-01-01
        • 2015-11-29
        相关资源
        最近更新 更多