За последние 24 часа нас посетили 15048 программистов и 1771 робот. Сейчас ищут 1466 программистов ...

Парщу HTML список - на выходе отношение родитель-потомок?

Тема в разделе "Прочие вопросы по PHP", создана пользователем kuteikin, 5 июл 2012.

  1. kuteikin

    kuteikin Активный пользователь

    С нами с:
    9 фев 2009
    Сообщения:
    21
    Симпатии:
    0
    Всем привет)) Подскажите, затупил.

    Есть HTML список
    Код (Text):
    1. <ul>
    2.   <li>
    3.     <a href="#">ссылка 1</a>
    4.     <ul>
    5.       <li>
    6.        <a href="#">ссылка 1 1</a>
    7.         <ul>
    8.           <li>
    9.             <a href="#">ссылка 1 1 1</a>
    10.           </li>
    11.         </ul>
    12.       </li>
    13.       <li>
    14.         <a href="#">ссылка 1 2</a>
    15.         <ul>
    16.           <li>
    17.            <a href="#">ссылка 1 2 1</a>
    18.           </li>
    19.         </ul>
    20.       </li>
    21.     </ul>
    22.   </li>
    23.   <li>
    24.     <a href="#">ссылка 2</a>
    25.   </li>
    26. </ul>
    Хочу его запарсить и получить отношения родитель потомок, примерно такое

    Код (Text):
    1.  
    2. id | id_parent | name
    3. ------------------------------
    4.  1 |     0     | ссылка 1
    5. ------------------------------
    6.  2 |     0     | ссылка 2
    7. ------------------------------
    8.  3 |     1     | ссылка 1 1
    9. ------------------------------
    10.  4 |     1     | ccылка 1 2
    11. ------------------------------
    12.  5 |     3     | ссылка 1 1 1
    13. ------------------------------
    14.  6 |     4     | ccылка 1 2 1
    15. ------------------------------
    Я конечно парсил с помощью PHP Simple HTML DOM и написал немало кода, НО даже немного не приблизился к получению нужной структуры

    Всем спасибо.
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Re: Парщу HTML список - на выходе отношение родитель-потомок

    Как успехи, ещё актуально?
    Сейчас делаю то же самое, распарсилось, вроде, нормально. Осталось проверить, обратно вывести html списком.

    Добавлено спустя 20 минут 5 секунд:
    Re: Парщу HTML список - на выходе отношение родитель-потомок?
    Проверил, всё ок.
     
  3. kuteikin

    kuteikin Активный пользователь

    С нами с:
    9 фев 2009
    Сообщения:
    21
    Симпатии:
    0
    Re: Парщу HTML список - на выходе отношение родитель-потомок

    расскажите как реализовали?
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    С помощью simplexml, т.к. меню по структуре идентично XML.
    Вместо встроенных средств (по привычке) делаю вспомогательный массив id и уровней вложенности.
    Код (PHP):
    1. <?php
    2. $input=file_get_contents('html.html');//загрузка html меню из первого поста
    3. $input='<?xml version="1.0" encoding="UTF-8"?><doc>'.$input.'</doc>';//добавление root и кодировки
    4. $xml=simplexml_load_string($input);//парсинг
    5.  
    6. $elementArr=array();//массив элементов с указанием id и parent
    7. $levelArr=array();//вспомогательный массив id и уровней для нахождения parent
    8.  
    9. function fillArr($ul,$lvl=0,&$id=1){//заполнение $elementArr
    10.     global $levelArr,$elementArr;
    11.     foreach ($ul->li as $li) {
    12.         $levelArr[$lvl]=$id;
    13.         $parent=(isset($levelArr[$lvl-1]))?$levelArr[$lvl-1]:0;
    14.         $elementArr[$id]=array('id'=>$id,'parent'=>$parent,'level'=>$lvl,'href'=>(string)$li->a['href'],'text'=>(string)$li->a);
    15.         $id++;
    16.         if(count($li->ul)>0){
    17.             $lvl++;
    18.             fillArr($li->ul,$lvl,$id);
    19.             $lvl--;
    20.         }
    21.     }
    22. }
    23. fillArr($xml->ul);
    24. //var_dump($elementArr);//тест
    На этом можно было бы и остановиться, т.к. уже можно построить дерево. Но очередность элементов получается другая, т.к. перебирали косточки последовательно:
    Код (Text):
    1. id  parent  title
    2. 1   0      ссылка 1
    3. 2   1      ссылка 1 1
    4. 3   2      ссылка 1 1 1
    5. 4   1      ссылка 1 2
    6. 5   4      ссылка 1 2 1
    7. 6   0      ссылка 2
    Попытка сделать по ТЗ, продолжение:
    Код (PHP):
    1. <?php
    2. //перелопачивание id// и parent
    3. $cea=count($elementArr);//оптимизация (доп. загружаем PHP парсингом и созданием переменной)
    4. $id=1;
    5. for($lvl=0;$lvl<count($levelArr);$lvl++){//по уровням
    6.     for($e=1;$e<=$cea;$e++){//по всем элементам..
    7.         if($elementArr[$e]['level']==$lvl){//уровня
    8.             $elementArr[$e]['id_new']=$id;
    9.             if($elementArr[$e]['parent']==0){
    10.                 $elementArr[$e]['parent_new']=0;
    11.             }
    12.             for($j=1;$j<=$cea;$j++){//всем элементам..
    13.                 if($elementArr[$j]['level']-$lvl==1){//уровнем выше..
    14.                     if($elementArr[$j]['parent']==$elementArr[$e]['id']){//кто связан родственными узами..
    15.                         $elementArr[$j]['parent_new']=$id;//добавляем новый parent
    16.                     }
    17.                 }
    18.             }
    19.             $id++;//новый id бережно приготовим для следующего элемента
    20.         }
    21.     }
    22. } 
    Получается
    Код (Text):
    1. id_new  parent_new  title
    2. 1        0          ссылка 1
    3. 2        0          ссылка 2
    4. 3        1          ссылка 1 1
    5. 4        1          ссылка 1 2
    6. 5        3          ссылка 1 1 1
    7. 6        4          ссылка 1 2 1
    В полях id_new и parent_new новые связи.

    Добавлено спустя 4 минуты 5 секунд:
    Re: Парщу HTML список - на выходе отношение родитель-потомок?
    Перечитываю, сам не понимаю, как в этом разобраться, что вчера накодил, но работает :)

    Добавлено спустя 6 минут 40 секунд:
    Re: Парщу HTML список - на выходе отношение родитель-потомок?
    Можно проверить, построить дерево заново:
    Код (PHP):
    1. <?php
    2. $id=(isset($_GET['id']))?(int)$_GET['id']:1;
    3. $out='';//тут будет меню
    4. function menu(&$arr,&$out,$parent=0,&$level=0){
    5.     global $id;
    6.     foreach($arr as $row){
    7.         $par=(isset($row['parent_new']))?$row['parent_new']:$row['parent'];
    8.         if($par==$parent){
    9.             $sel=($row['id_new']==$id)?' class="sel"':'';
    10.             $level++;
    11.             $out.=sprintf('%s<li%s>[url="?id=%d"]%s[/url]',
    12.                 str_repeat("\t",$level),$sel,$row['id_new'],$sel,$row['text']);
    13.             $inner='';
    14.             $level++;
    15.             menu($arr,$inner,$row['id_new'],$level);
    16.             $level--;
    17.             if(strlen($inner)>0){
    18.                 $out.=sprintf('%s%s<ul>%s%s%s</ul>%s%s',
    19.                     "\n",str_repeat("\t",$level+1),"\n",$inner,str_repeat("\t",$level+1),"\n",str_repeat("\t",$level));
    20.             }
    21.             $out.="</li>\n";
    22.             $level--;
    23.         }
    24.     }
    25. }
    26.  
    27. menu($elementArr,$out,0);//меню в переменную $out
    28. ?>
    29. <ul>
    30. <?=$out?>
    31. </ul>
     
  5. kuteikin

    kuteikin Активный пользователь

    С нами с:
    9 фев 2009
    Сообщения:
    21
    Симпатии:
    0
    Re: Парщу HTML список - на выходе отношение родитель-потомок

    Спасибо! Помогло!
    день разбирался)))