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
)