Отсутствующие узлы в дереве многомерного массива - PullRequest
0 голосов
/ 04 апреля 2011

Попытка создать дерево в многомерном массиве с помощью следующего кода

$source = array(
(array('id'=>406,'parent'=>0,'title'=>'level_0_406')),
(array('id'=>270,'parent'=>268,'title'=>'level_0_406_268_270')),
(array('id'=>271,'parent'=>268,'title'=>'level_0_406_268_271')),
(array('id'=>272,'parent'=>268,'title'=>'level_0_406_268_272')),
(array('id'=>273,'parent'=>268,'title'=>'level_0_406_268_273)')),
(array('id'=>269,'parent'=>268,'title'=>'level_0_406_268_269')),
(array('id'=>268,'parent'=>406,'title'=>'level_0_406_268')),
(array('id'=>407,'parent'=>406,'title'=>'level_0_406_407')),
(array('id'=>274,'parent'=>406,'title'=>'level_0_406_274')),
(array('id'=>500,'parent'=>407,'title'=>'level_0_406_407_500')),
);

$result = array();
$links = array(0=>&$result);

foreach ($source as &$element){
    $links[$element['id']] = &$element;     
    $links[$element['parent']]['childs'][$element['id']] = &$element;
}

Но массив результатов не включает несколько узлов исходного массива, а именно.узлы с id = 269,270,271,272,273.

Array
(
    [childs] => Array
        (
            [406] => Array
                (
                    [id] => 406
                    [parent] => 0
                    [title] => level_0_406
                    [childs] => Array
                        (
                            [268] => Array
                                (
                                    [id] => 268
                                    [parent] => 406
                                    [title] => level_0_406_268
                                )

                            [407] => Array
                                (
                                    [id] => 407
                                    [parent] => 406
                                    [title] => level_0_406_407
                                    [childs] => Array
                                        (
                                            [500] => Array
                                                (
                                                    [id] => 500
                                                    [parent] => 407
                                                    [title] => level_0_406_407_500
                                                )

                                        )

                                )

                            [274] => Array
                                (
                                    [id] => 274
                                    [parent] => 406
                                    [title] => level_0_406_274
                                )

                        )

                )

        )

)

Я пробовал разные примеры кода генерации дерева, но все они имеют одну и ту же проблему с массивом исходного кода, например $ source.Пожалуйста, помогите мне понять такое поведение.

Обновление Теперь я понимаю, что не так с массивом.Но что, если у меня есть такие данные в БД, как правильно сделать выбор?Массив $ source должен быть специально отсортирован перед использованием функции генерации дерева.

1 Ответ

1 голос
/ 04 апреля 2011

Исходные значения массива $source созданы неправильно.Это должно быть: -

$source = array(
  (array('id'=>406,'parent'=>0,'title'=>'level_0_406')),
  (array('id'=>268,'parent'=>406,'title'=>'level_0_406_268')),
  (array('id'=>407,'parent'=>406,'title'=>'level_0_406_407')),
  (array('id'=>274,'parent'=>406,'title'=>'level_0_406_274')),
  (array('id'=>270,'parent'=>268,'title'=>'level_0_406_268_270')),
  (array('id'=>271,'parent'=>268,'title'=>'level_0_406_268_271')),
  (array('id'=>272,'parent'=>268,'title'=>'level_0_406_268_272')),
  (array('id'=>273,'parent'=>268,'title'=>'level_0_406_268_273)')),
  (array('id'=>269,'parent'=>268,'title'=>'level_0_406_268_269')),
  (array('id'=>500,'parent'=>407,'title'=>'level_0_406_407_500')),
);

Если вы посмотрите внимательно, вы увидите, что ранее был доступен только дочерний элемент идентификатора родительского элемента 407, поскольку идентификатор элемента 407 был определендо появления дочернего элемента.

Фактически в вашей логике кодирования сначала определены родительские элементы, а затем определения дочерних элементов.Кроме того, общая практика и стандарты всегда были одинаковыми.

В своем ответе я правильно изменил вхождение элементов.Это должно сработать.

Надеюсь, это поможет.

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