манипулирование вложенным многомерным массивом - PullRequest
3 голосов
/ 14 ноября 2011
Array
(

    [178] => Array
        (
        )

    [179] => Array
        (
            [180] => 
            [181] => 
            [182] => 
            [183] => 
        )

    [184] => Array
        (
            [185] => 
        )

    [186] => Array
        (
        )

    [189] => Array
        (
            [190] => 
        )

    [181] => Array
        (
            [191] => 
            [192] => 
        )

    [192] => Array
        (
            [194] => 
        )

)

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

например, 179 -> 181 -> 192 -> 194

Может быть много уровней узлов, а не только то, что я имею в этом примере. Как я могу рекурсивно добавить все узлы вместе в правильном порядке?

ОБНОВЛЕНО У меня также есть массив всех концов на узле, то есть идентификаторы, у которых больше нет узлов.

Массив ( [0] => 178 [1] => 180 [2] => 182 [3] => 183 [4] => 185 [5] => 186 [6] => 190 [7] => 191 [8] => 194 )

1 Ответ

2 голосов
/ 14 ноября 2011

Я не уверен, что это то, что вы ищете, и я уверен, что есть много более эффективных способов сделать это.но вот пример:

Учитывая приведенный выше пример ввода.

Этот код:

function index_nodes($nodes, &$index) {
    foreach($nodes as $key => $value) {
        if ($value) {
            $index[$key] = $value;
            index_nodes($value, $index);
        }
    }
}

function nest_list($list) {
    $index = array();
    index_nodes($list, $index);

    // Construct tree
    $build_tree = function(&$value, $key) use ($index, &$updated) {
        if(array_key_exists($key, $index)) {
            $value = $index[$key];
            $updated = true;
        }
    };

    // This needs done several times, since I can't be sure I nested things
    // in the perfect order.
    do {
        $updated = false;
        array_walk_recursive($list, $build_tree);
    } while($updated);

    return $list;
}

Выполнить так:

$list2 = nest_list($list);
print_r($list2);

Дает следующий вывод:

Array
(
    [178] => 
    [179] => Array
        (
            [180] => 
            [181] => Array
                (
                    [191] => 
                    [192] => Array
                        (
                            [194] => 
                        )
                )
            [182] => 
            [183] => 
        )
    [184] => Array
        (
            [185] => 
        )
    [186] => 
    [189] => Array
        (
            [190] => 
        )
    [181] => Array
        (
            [191] => 
            [192] => Array
                (
                    [194] => 
                )

        )
    [192] => Array
        (
            [194] => 
        )
)

Еще раз ... большая куча кода, но я думаю, что это приближает вас к вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...