【问题标题】:PHP - Losing the array references out of the function (local to global)PHP - 从函数中丢失数组引用(本地到全局)
【发布时间】:2014-03-01 17:43:47
【问题描述】:

我创建了一个小函数,通过用类 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";

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

有没有办法在输出中维护引用

【问题讨论】:

  • 是的,有这样的a way

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


【解决方案1】:

你可以return references

但是我发现你的方法真的很麻烦,而且很快就会导致行为不端/可维护性/可读性问题。

【讨论】:

    【解决方案2】:

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

    <?php
    
    function &foo(&$arr) {
      return $arr[0];
    }
    
    $a = [[]];
    $b = &foo($a);
    $b[0] = 'bar';
    print_r($a); /* outputs [ [ 'bar' ] ] */
    

    【讨论】:

    • 只是为了扩展这个答案,您对array_get 的调用必须使用引用分配。这包括它的内部递归调用。但是,将&amp; 添加到return foo() 会导致语法错误。所以你必须把它赋值给一个变量,然后返回这个变量。
    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 2017-04-25
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多