Отрисовка связных элементов массива в PHP
Структура данных такова:
1|0|Electronics 2|0|Video 3|0|Photo 4|1|MP3 player 5|1|TV 6|4|iPod 7|6|Shuffle 8|3|SLR 9|8|DSLR 10|9|Nikon 11|9|Canon 12|11|20D
Данные хранятся в виде построчных записей, с полями id, parent_id и title.При этом полю parent_id присваивается нулевое значение в том случае, когда элемент является автономным и находится на верхнем уровне иерархии элементов. Скажу пару слов о реализации. Для реализации отрисовки был выбран стандартный рекурсивный алгоритм, а так же использованы строковые функции входящие в стандартную поставку пакета PHP. Для отрисовки в функцию, изначально, передаётся массив содержащий все записи из БД. Первым шагом функция выбирает корневые элементы, а то есть такие, которые не относятся к другим, и их значение pid равно нулю.После происходит составление нового массива элементов, значение pid которых, равно текущему индексу элемента (элементы дочерние данному). Далее функция выполняет рекурсивный вызов, в качестве параметра при этом передаётся составленный на предыдущем шаге массив.
Вообщем как это вышло :)
<?php $data=file('data.db'); $db=array(); foreach($data as $k=>$v){ $v=explode('|',$v); $db[$k]=array(); $db[$k]['id']=$v[0]; $db[$k]['pid']=$v[1]; $db[$k]['title']=$v[2]; } function printTree($array){ global $db; for($i=0;$i<(count($array));$i++){ #print $array[$i]['id'].'='.$array[$i]['title']; if($array[$i]['pid']==0){ print '<li>'.$array[$i]['title']."</li>"; $child=array(); for($j=0;$j<count($db);$j++){ if($db[$j]['pid']!=0 && $db[$j]['pid']==$array[$i]['id']){ $child[]=array('id'=>$db[$j]['id'],'pid'=>0,'title'=>$db[$j]['title']); } } print '<ul>'; print printTree($child); print '</ul>'; } } } print'<ul>'; printTree($db); print'</ul>'; ?>
Оставить комментарий
Комментарии
Но с другой стороны для новичков очень даже интересные есть моменты. Рекурсия та же.. или представление данных (пусть и не самый красивый вариант)
зачем в printtree масив передавать, поредал pid и пошел рисовать элементы, отрисовал один вызывай ее опять и передавай ей id только что отрисованного элемента. такие задачи решают учащиеся старших классов ;), извините товарищь - незачет!