0

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 ()
                                        )
                                )
                        )
                )
        )
)

私は何が欠けていますか?

4

1 に答える 1

0

参照による移動は架空のアプローチだと思います。私は次のコードを使用することになりました。

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

function relocate($node, $id, &$arr=NULL) {
    global $myArr;
    if (is_null($arr)) $arr = &$myArr;
    foreach ($arr as &$arr1) {
        if ($arr1['id'] == $id) {
            return array_push($arr1['arr'], $node);
        }
        if (!empty($arr1['arr'])) relocate($node, $id, &$arr1['arr']);
    }
}
于 2012-09-20T14:48:21.797 に答える