PHP从递归函数返回引用

时间:2018-01-11 09:00:27

标签: php recursion

我正在尝试创建一个递归函数,它在多维数组中按值(blubb)搜索特定元素并将其作为引用返回。但我的第一个想法是行不通的。我确定我错过了一些简单的事情。

$array = [
    'obj1' => [
        'attr1' => "blubb",
        'attr2' => "bla"
        ],
    'obj2' => [
        'attr1' => "blabb",
        'attr2' => "bla"
        ]
    ];

$node = changeAttr2($array);
$node["attr2"] = "blu";

print_r($node);
print_r($array);

function changeAttr2(&$input) {
    foreach($input as &$value) {
        if ($value === "blubb") {
            return $input;
        }

        return changeAttr2($value);
    }
}

输出:

Array
(
    [obj1] => Array
        (
            [attr1] => blubb
            [attr2] => bla
        )

    [obj2] => Array
        (
            [attr1] => blabb
            [attr2] => bla
        )

)

预期产出:

Array
(
    [obj1] => Array
        (
            [attr1] => blubb
            [attr2] => blu
        )

    [obj2] => Array
        (
            [attr1] => blabb
            [attr2] => bla
        )

)

1 个答案:

答案 0 :(得分:1)

您通过引用传递数组,但是当您返回它时,您实际上并没有返回引用。

这样做(老实说,这看起来非常脏,需要重新思考,但如果你真的需要,这就是你做的方式):

<?php
$array = [
    'obj1' => [
        'attr1' => "blubb",
        'attr2' => "bla"
        ],
    'obj2' => [
        'attr1' => "blabb",
        'attr2' => "bla"
        ]
    ];

$node = &changeAttr2($array);
$node["attr2"] = "blu";

print_r($node);
print_r($array);

function &changeAttr2(&$input) {
    foreach($input as &$value) {
        if ($value === "blubb") {
            return $input;
        }

        return changeAttr2($value);
    }
}

打印:

Array
(
    [obj1] => Array
        (
            [attr1] => blubb
            [attr2] => blu
        )

    [obj2] => Array
        (
            [attr1] => blabb
            [attr2] => bla
        )

)

原因是您需要返回引用并将其用作参考。

the manual on returning references

中的更多细节