通过引用传递的数组的奇怪行为

时间:2015-11-10 09:21:34

标签: php arrays pass-by-reference

我对一个简单的函数得到了意想不到的结果,该函数有一个参考传递的参数。

我们假设我们有以下数组:

$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中的错误?

3 个答案:

答案 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