Дерево категорий в массиве

OlegEF

Новичок
на базе этого примера создаю древовидный массив
http://phpclub.ru/talk/threads/Вопросег-по-деревьям.54896/#post-474430

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

в какую сторону копать?
 

OlegEF

Новичок
Данные из базы заносятся в массив
Код:
$result = $_DB->query("SELECT cat_id, parent_id FROM tab1 ORDER BY parent_id ASC");
$simple_array=array();

while ($row = mysqli_fetch_assoc($result)){
     array_push ($simple_array,array('cat_id'=>$row['cat_id'],'parent_id'=>$row['parent_id']]));
}

далее создается многомерный массив (дерево):

Код:
$root = array(); 
	$links = array(0=>&$root); 
	
	foreach ($simple_array as &$element){ 
	    $links[$element['cat_id']] = &$element;     
	    $links[$element['parent_id']]['childs'][$element['cat_id']] = &$element; 
	}
В итоге получается что-то вроде следующего:

Код:
Array
(
    [childs] => Array
        (
            [406] => Array
                (
                    [cat_id] => 406
                    [parent_id] => 0
                    [childs] => Array
                        (
                            [411] => Array
                                (
                                    [cat_id] => 411
                                    [parent_id] => 406
                                )

                            [268] => Array
                                (
                                    [cat_id] => 268
                                    [parent_id] => 406
                                )

                            [407] => Array
                                (
                                    [cat_id] => 407
                                    [parent_id] => 406
                                )

                            [274] => Array
                                (
                                    [cat_id] => 274
                                    [parent_id] => 406
                                )

                        )

                )

        )
Но у категори 268 есть еще 5 подкатегорий (269,270,271,272,273), которые в дерево не попадают, хотя в $simple_array они есть.

Не могу понять почему.
 

OlegEF

Новичок
есть подозрения, что дело в нумерации категорий. если подкатегория имеет меньший ID чем категория возникает проблема.
 

OlegEF

Новичок
PHP:
$test = 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')),
);
вот пример массива. ветви с 269 по 273 в дерево не попадут
 

KorP

Новичок
PHP:
<?php
$test = array(
	array('id'=>406,'parent'=>0,'title'=>'level_0_406'),
	array('id'=>268,'parent'=>406,'title'=>'level_0_406_268'),
		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'=>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'),
	
	

); 

$menu = array();
$menu_index = array();

for ($i=0; $i<count($test); $i++) {
	if($test[$i]['parent'] == 0) {
		$menu[] = $test[$i];
		$menu[sizeof($menu)-1]['child'] = array();
		$menu_index[$test[$i]['id']] = &$menu[sizeof($menu)-1];
	} else {
		$menu_index[$test[$i]['parent']]['child'][] = $test[$i];
		$menu_index[$test[$i]['id']] = &$menu_index[$test[$i]['parent']]['child'][sizeof($menu_index[$test[$i]['parent']]['child'])-1];
	}
}

print_r($menu);
?>
PHP:
Array ( [0] => Array ( [id] => 406 [parent] => 0 [title] => level_0_406 [child] => Array ( [0] => Array ( [id] => 268 [parent] => 406 [title] => level_0_406_268 [child] => Array ( [0] => Array ( [id] => 270 [parent] => 268 [title] => level_0_406_268_270 ) [1] => Array ( [id] => 271 [parent] => 268 [title] => level_0_406_268_271 ) [2] => Array ( [id] => 272 [parent] => 268 [title] => level_0_406_268_272 ) [3] => Array ( [id] => 273 [parent] => 268 [title] => level_0_406_268_273 ) [4] => Array ( [id] => 269 [parent] => 268 [title] => level_0_406_268_269 ) ) ) [1] => Array ( [id] => 407 [parent] => 406 [title] => level_0_406_407 [child] => Array ( [0] => Array ( [id] => 500 [parent] => 407 [title] => level_0_406_407_500 ) ) ) [2] => Array ( [id] => 274 [parent] => 406 [title] => level_0_406_274 ) ) ) )
я если честно тоже не сильно понял в чём косяк в твоих данных. первый раз скопипастил - тоже не отображались ветки 268 родителя, потом убрал лишние скобочки - не заработало, удалил их, скопировал другую запись, поменял parent на 268 - заработало, вернул кусок массива с 268 парентом - заработало :D
 

Single

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

KorP

Новичок
Ну ты хотя бы догадался переместить родительскую запись в очедерь до рождения ребенка правдо похоже не до конца осознал для чего это делается.
ну я понимал что с массивом что то не так, а вот что именно до мня не дошло :)
 

OlegEF

Новичок
да, ребят, спасибо. я уже понял где был не прав.
но вопрос усложняется, тем что выборка выполняется из базы и сортировка ни по одному ни по двум полям не даст нужного порядка в исходном массиве, т.к.
есть ноды где id родителей выше по значению чем id наследников.
 
Сверху