PHP - 丢失函数中的数组引用(本地到全局)

时间:2014-02-05 10:35:43

标签: php arrays function multidimensional-array pass-by-reference

我创建了一个小函数来解析并通过用类Unix路径语法编写的字符串从多维数组中获取元素。

function array_get($path, &$array) {
    $keys = preg_split('/[\/\\\]+/', $path, null, PREG_SPLIT_NO_EMPTY);
    $current = trim(array_shift($keys));
    if (is_array($array) && array_key_exists($current, $array)) {
        $path = implode("/", $keys);
        if (empty($path)) {
            // (Place the code here, see below)
            return $array[$current];
        }
        return array_get($path, $array[$current]);
    }
    return false;
}

所以,如果我有一个像这样的简单数组

$arr = array(
    "A" => array(
        "X" => array(),
        "Y" => array(),
        "Z" => array()
    ),
    "B" => array(
        "X" => array(),
        "Y" => array(),
        "Z" => array()
    ),
    "C" => array(
        "X" => array(),
        "Y" => array(),
        "Z" => array()
    )
);

我希望在这些条目中填写

$arr['A']['Z'][] = "foo";
$arr['A']['Z'][] = "bar";

我会使用以下语句做同样的工作:

$var = array_get("A/Z", $arr);
$var[] = "foo";
$var[] = "bar";

但出了点问题。

如果您尝试运行代码,您会注意到超出本地范围对传递的数组的引用将会丢失。

如果您希望运行测试,可以使用以下两个代码行替换函数内的占位符注释行:

            $array[$current][] = "foo";
            $array[$current][] = "bar";

然后你会看到该函数实际上会执行自己的工作。

有没有办法在输出中维护参考

2 个答案:

答案 0 :(得分:1)

the documentation开始,您可以指定要在函数名称 AND 之前使用&字符返回引用。

<?php

function &foo(&$arr) {
  return $arr[0];
}

$a = [[]];
$b = &foo($a);
$b[0] = 'bar';
print_r($a); /* outputs [ [ 'bar' ] ] */

答案 1 :(得分:0)

你可以return references

但我觉得你的方法非常麻烦,很快就会导致行为不端/可维护性/可读性问题。