Отрисовка связных элементов массива в 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 только что отрисованного элемента. такие задачи решают учащиеся старших классов ;), извините товарищь - незачет!

