PHP从数组复制引用到数组

时间:2017-10-07 02:33:48

标签: 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);

结果:

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],&一个[2]}

4 个答案:

答案 0 :(得分:3)

当我尝试引用密钥

时,即使我收到错误
$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
)

答案 1 :(得分:2)

<li> <p>I love hay bales. Took this snap on a drive through the countryside past some straw fields.</p> <a href="photos/01.jpg" alt='Hay Bales' data-lightbox="image" data-title="I love hay bales. Took this snap on a drive through the countryside past some straw fields."> <img src="photos/thumbnails/01.jpg" alt="Hay Bales"> </a> </li> <a href="photos/01.jpg" alt='Hay Bales' data-lightbox="image" data-title="I love hay bales. Took this snap on a drive through the countryside past some straw fields."> <img src="photos/thumbnails/01.jpg" alt="Hay Bales"> </a> <a href="photos/01.jpg" alt='Hay Bales' data-lightbox="image" data-title="I love hay bales. Took this snap on a drive through the countryside past some straw fields."> <img src="photos/thumbnails/01.jpg" alt="Hay Bales"> </a> <button>On/Off</button> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>循环中,您将新数组foreach的每个元素设置为引用变量$b。因此,在$v循环结束时,它们都指向foreach的最后/当前值,即#34; 2017-10-6&#34;。

你可以用这种方式引用数组$v的元素:

$a

答案 2 :(得分:0)

像这样参考

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

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

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

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

答案 3 :(得分: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