我对一个简单的函数得到了意想不到的结果,该函数有一个参考传递的参数。
我们假设我们有以下数组:
$arr = array(
'Test' => 1,
'OtherKey' => 2,
);
$keyTranslation = array(
'OtherKey' => 'other_key',
'Test' => 'test',
);
$keyTranslation
数组可能没有按照与$arr
相同的顺序定义键。这只是为了解释函数的需要。
以及以下功能:
function test(&$arr, $keyTranslation) {
foreach ($arr as $key => $value) {
$arr[$keyTranslation[$key]] = $value;
unset($arr[$key]);
}
}
意外的结果是简单地调用上面带有数组的函数作为参数:
test($arr, $keyTranslation);
我的期望是什么?
array(2) {
["test"]=>
int(1)
["other_key"]=>
int(2)
}
我得到了什么?
NOTICE Undefined index: test on line number 10
NOTICE Undefined index: other_key on line number 10
NOTICE Undefined index: on line number 10
array(0) { }
为什么会这样?
因为每次我向传递的引用数组添加一个新值时,循环也会迭代该值并取消设置。
问题
这是正常的吗?或者它是PHP中的错误?
答案 0 :(得分:1)
这就是我要用的东西,因为它似乎有点狡猾的设置& function test(&$arr, $keyTranslation) {
$newarr = array();
foreach ($arr as $key => $value) {
$newarr[$keyTranslation[$key]] = $value;
}
$arr = $newarr; // Not sure if you'd have to unset $arr first...
}
通过它时数组的未设置元素......
SetPoint
答案 1 :(得分:1)
确保测试翻译的密钥是否存在:
<?php
$arr = [ 'Foo' => 1, 'Bar' => 2 , 'dont_change' => 3, ];
$trans = [ 'Foo' => 'bar', 'Bar' => 'foo', 'Foobar' => 'foobar', ];
function test(&$arr, $trans) {
foreach($arr as $key => $value) {
if (!isset($trans[$key])) continue;
$arr[$trans[$key]] = $value;
unset($arr[$key]);
}
}
test($arr, $trans);
print_r($arr);
答案 2 :(得分:0)
这里没有错误。首先,$arr
中的密钥为'Test'
和'OtherKey'
。在您的功能中,您尝试访问不存在的$arr['test']
和$arr['other_key']
,因此请注意。然后你取消设置密钥,因此结果是函数调用后$arr
为空,因为你通过引用传递了$arr
。