Обход дерева DOM с циклом foreach

Нужна помощь в обходе дерева DOM с помощью Simple HTML DOM Parser. Если кто-то может потратить секунду, чтобы посмотреть, как это работает, знающие PHP-кодеры должны быстро понять это, если я понял это. Где я застрял, так это в получении статей от отдела на российском баскетбольном сайте моего друга. Например, вот как выглядит блок блога:

<div id='columnsList'><div class='item'>
  <div class='title'><a href='/ru/columns/1'>Колонка Римантаса Григаса</a></div>
  <div class='img'> <img src='/files/columns/grigas.jpg'></div>
  <div class='news'>
    <a href='/ru/news/3174'>Римантас Григас: о пути на Евробаскет (0)</a>
    <a href='/ru/news/1486'>Римантас Григас: об уходе из УГМК и о ближайших планах (1)</a>
    <a href='/ru/news/731'>О горниле «Финала восьми» Евролиги (0)</a>
    <a href='/ru/news/421'>О новом назначении и о сборной Украины (0)</a>
    <a href='/ru/news/299'>О настоящем примере для подражания (0)</a>
  </div><div style='clear:left;'></div> 
  </div>
  <div class='item'>
  <div class='title'><a href='/ru/columns/2'>Колонка Кирилла Натяжко</a></div>
  <div class='img'> <img src='/files/columns/nati.jpg'> </div>
  <div class='news'>
    <a href='/ru/news/3618'>Кирилл Натяжко: "Хорватов мы не боимся" (2)</a>
    <a href='/ru/news/3113'>Кирилл Натяжко: "Необоснованная критика подарила мне дополнительную мотивацию" (1)</a>
    <a href='/ru/news/2454'>Кирилл Натяжко: "Мне нечего бояться, пускай лучше боятся меня!" (6)</a>
    <a href='/ru/news/325'>Доброе утро, страна! (1)</a>
  </div><div style='clear:left;'></div> 
</div>
<div class='news'>
//More divs and links

Вот как я могу вытащить отдельные ссылки «а» и отобразить их, но я хочу получить заголовок div для всех из них, в основном классифицировать их, а не располагать все подряд. Я не могу понять, как это сделать в цикле foreach.

foreach ($html->find('div[class=item] a[href*=news]') as $col){
   echo $col.'<br>';
}

Я попытался добавить вместе с первым эхом:

echo $col->parent()->prev_sibling()->prev_sibling()->a;

Это должно вернуться к div «новости», затем еще одна ступень вверх к div «img» и снова к div «title». Это должно получить ссылку первого div=title. Но я ничего не получаю. Есть ли способ сделать это?


person denikov    schedule 20.03.2013    source источник


Ответы (2)


Попробуй это:

$output = array();
foreach($html->find('div[class=item]' as $item) {
   $title = $item->find('div[class=title] a', 0)->innertext;
   $output[$title] = array();
   foreach($item->find('div[class=news] a') as $link) {
       $output[$title][] = $link->innertext;
   }
}
person artahian    schedule 20.03.2013
comment
Ничего. Исходный код пустой. Ты можешь рассказать мне об этом? То, что вы говорите, это класс элементов foreach, получить первую ссылку, правильно? Затем вы устанавливаете выходной массив на эту ссылку заголовка «a» и зацикливаете только внутри этого div заголовка? Я борюсь с массивами прямо сейчас... - person denikov; 20.03.2013
comment
Ду, он пустой. Потому что нет эхо-оператора. Можете ли вы обновить с помощью инструкции эха? Буду ли я выводить вывод[$title][]? - person denikov; 20.03.2013
comment
сделайте var_dump($output);, чтобы увидеть, что он содержит в конце. - person artahian; 20.03.2013
comment
Это формат, который он выдал: массив (1) {[название] => массив (1) {[0] и первая статья}} массив (1) Затем для массива два он показывает [0] и добавляет [ 1] к нему. То же самое для второго, чтобы он дублировался и троился (если это слово) и так далее. - person denikov; 20.03.2013
comment
Ваш вопрос был связан с Simple HTML Dom Parser, поэтому я оставляю остальные детали вашему вниманию, очевидно, что вам потребуются соответствующие знания PHP, чтобы впоследствии использовать результат. - person artahian; 20.03.2013
comment
Получил ответ. Проверьте это. Это было так просто. Спасибо за совет по вложенному циклу. Я пробовал это раньше, но неправильно. Разговор по вашей петле помог мне с моей. - person denikov; 20.03.2013

Это способ сделать это без использования массивов!

foreach ($html->find('div[class=item]') as $item){
    echo $item->children(0)->plaintext;
    foreach ($item->find('a[href*=news]') as $col){
      echo $col.'<br>';
    }
}

Получил желаемый результат!

person denikov    schedule 20.03.2013