Всем привет)) Подскажите, затупил. Есть HTML список Код (Text): <ul> <li> <a href="#">ссылка 1</a> <ul> <li> <a href="#">ссылка 1 1</a> <ul> <li> <a href="#">ссылка 1 1 1</a> </li> </ul> </li> <li> <a href="#">ссылка 1 2</a> <ul> <li> <a href="#">ссылка 1 2 1</a> </li> </ul> </li> </ul> </li> <li> <a href="#">ссылка 2</a> </li> </ul> Хочу его запарсить и получить отношения родитель потомок, примерно такое Код (Text): id | id_parent | name ------------------------------ 1 | 0 | ссылка 1 ------------------------------ 2 | 0 | ссылка 2 ------------------------------ 3 | 1 | ссылка 1 1 ------------------------------ 4 | 1 | ccылка 1 2 ------------------------------ 5 | 3 | ссылка 1 1 1 ------------------------------ 6 | 4 | ccылка 1 2 1 ------------------------------ Я конечно парсил с помощью PHP Simple HTML DOM и написал немало кода, НО даже немного не приблизился к получению нужной структуры Всем спасибо.
Re: Парщу HTML список - на выходе отношение родитель-потомок Как успехи, ещё актуально? Сейчас делаю то же самое, распарсилось, вроде, нормально. Осталось проверить, обратно вывести html списком. Добавлено спустя 20 минут 5 секунд: Re: Парщу HTML список - на выходе отношение родитель-потомок? Проверил, всё ок.
С помощью simplexml, т.к. меню по структуре идентично XML. Вместо встроенных средств (по привычке) делаю вспомогательный массив id и уровней вложенности. Код (PHP): <?php $input=file_get_contents('html.html');//загрузка html меню из первого поста $input='<?xml version="1.0" encoding="UTF-8"?><doc>'.$input.'</doc>';//добавление root и кодировки $xml=simplexml_load_string($input);//парсинг $elementArr=array();//массив элементов с указанием id и parent $levelArr=array();//вспомогательный массив id и уровней для нахождения parent function fillArr($ul,$lvl=0,&$id=1){//заполнение $elementArr global $levelArr,$elementArr; foreach ($ul->li as $li) { $levelArr[$lvl]=$id; $parent=(isset($levelArr[$lvl-1]))?$levelArr[$lvl-1]:0; $elementArr[$id]=array('id'=>$id,'parent'=>$parent,'level'=>$lvl,'href'=>(string)$li->a['href'],'text'=>(string)$li->a); $id++; if(count($li->ul)>0){ $lvl++; fillArr($li->ul,$lvl,$id); $lvl--; } } } fillArr($xml->ul); //var_dump($elementArr);//тест На этом можно было бы и остановиться, т.к. уже можно построить дерево. Но очередность элементов получается другая, т.к. перебирали косточки последовательно: Код (Text): id parent title 1 0 ссылка 1 2 1 ссылка 1 1 3 2 ссылка 1 1 1 4 1 ссылка 1 2 5 4 ссылка 1 2 1 6 0 ссылка 2 Попытка сделать по ТЗ, продолжение: Код (PHP): <?php //перелопачивание id// и parent $cea=count($elementArr);//оптимизация (доп. загружаем PHP парсингом и созданием переменной) $id=1; for($lvl=0;$lvl<count($levelArr);$lvl++){//по уровням for($e=1;$e<=$cea;$e++){//по всем элементам.. if($elementArr[$e]['level']==$lvl){//уровня $elementArr[$e]['id_new']=$id; if($elementArr[$e]['parent']==0){ $elementArr[$e]['parent_new']=0; } for($j=1;$j<=$cea;$j++){//всем элементам.. if($elementArr[$j]['level']-$lvl==1){//уровнем выше.. if($elementArr[$j]['parent']==$elementArr[$e]['id']){//кто связан родственными узами.. $elementArr[$j]['parent_new']=$id;//добавляем новый parent } } } $id++;//новый id бережно приготовим для следующего элемента } } } Получается Код (Text): id_new parent_new title 1 0 ссылка 1 2 0 ссылка 2 3 1 ссылка 1 1 4 1 ссылка 1 2 5 3 ссылка 1 1 1 6 4 ссылка 1 2 1 В полях id_new и parent_new новые связи. Добавлено спустя 4 минуты 5 секунд: Re: Парщу HTML список - на выходе отношение родитель-потомок? Перечитываю, сам не понимаю, как в этом разобраться, что вчера накодил, но работает Добавлено спустя 6 минут 40 секунд: Re: Парщу HTML список - на выходе отношение родитель-потомок? Можно проверить, построить дерево заново: Код (PHP): <?php $id=(isset($_GET['id']))?(int)$_GET['id']:1; $out='';//тут будет меню function menu(&$arr,&$out,$parent=0,&$level=0){ global $id; foreach($arr as $row){ $par=(isset($row['parent_new']))?$row['parent_new']:$row['parent']; if($par==$parent){ $sel=($row['id_new']==$id)?' class="sel"':''; $level++; $out.=sprintf('%s<li%s>[url="?id=%d"]%s[/url]', str_repeat("\t",$level),$sel,$row['id_new'],$sel,$row['text']); $inner=''; $level++; menu($arr,$inner,$row['id_new'],$level); $level--; if(strlen($inner)>0){ $out.=sprintf('%s%s<ul>%s%s%s</ul>%s%s', "\n",str_repeat("\t",$level+1),"\n",$inner,str_repeat("\t",$level+1),"\n",str_repeat("\t",$level)); } $out.="</li>\n"; $level--; } } } menu($elementArr,$out,0);//меню в переменную $out ?> <ul> <?=$out?> </ul>