PHP:通过循环和函数跨数组元素移动(不复制)引用的数组

时间:2012-09-19 23:32:18

标签: php arrays pass-by-reference

我有一个有序数组,以确保每个ref键存在于同一数组中的前一个元素中。但是,引用可能位于以前元素中的另一个数组中。所以我使用递归函数来找到合适的位置,但出于某种原因我无法删除前一个元素。

我能做什么:将必要的元素复制到他们所属的位置 我可以做什么:跨数组移动这些元素

这是原始数组的伪输出。

Array
(
    [0] => Array
        (
            [id] => 1
            [ref] => 
            [arr] => Array ()
        )
    [1] => Array
        (
            [id] => 2
            [ref] => 1
            [arr] => Array ()
        )
    [2] => Array
        (
            [id] => 3
            [ref] => 1
            [arr] => Array ()
        )
    [3] => Array
        (
            [id] => 4
            [ref] => 3
            [arr] => Array ()

        )
)

这是我的代码。

$myArr = array(/* above elements gathered from the DB */);
foreach ($myArr as &$arr) {
    if (!is_null($arr['ref'])) relocate($arr, $arr['ref']);
}
unset($arr);

function relocate(&$node, $id, &$arr=NULL) {
    global $myArr;
    if (is_null($arr)) $arr = &$myArr;
    foreach ($arr as &$arr1) {
        if ($arr1['id'] == $id) {
            array_push($arr1['arr'], &$node);
            return;
        }
    }
    unset($arr1); // not sure if this is necessary
    if (!empty($arr['arr'])) relocate(&$node, $id, &$arr['arr']);
}

所需的输出:

Array
(
    [0] => Array
        (
            [id] => 1
            [ref] => 
            [arr] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [ref] => 1
                            [arr] => Array ()
                        )
                    [1] => Array
                        (
                            [id] => 3
                            [ref] => 1
                            [arr] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 4
                                            [ref] => 3
                                            [arr] => Array ()
                                        )
                                )
                        )
                )
        )
)

我错过了什么?

0 个答案:

没有答案