У меня есть упорядоченный массив, поэтому каждый ключ 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
inhan 20 Сен 2012 в 03:32

1 ответ

Лучший ответ

Я думаю, что перемещение по ссылке - это воображаемый подход. В итоге я использовал следующий код.

$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']);
    }
}
0
inhan 20 Сен 2012 в 18:48