Как проверить, есть ли в списке узлов dom тот же самый узел? - PullRequest
0 голосов
/ 23 февраля 2019

Мне нужно получить все родители всех абзацев страницы и всех элементов списка по PHP DOMDocument

Скажем, у нас есть такой HTML:

<div>
    <p>Some text</p>
    <p>Some text</p>
</div>
<section>
    <p>Some text</p>
    <p>Some text</p>
    <p>Some text</p>
</section>
<ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
</ul>

Если я использую дваследующие циклы

$parents = [];
foreach($dom->getElementsByTagName('p') as $paragraph) {
    $parents[] = $paragraph->parentNode;
}
foreach($dom->getElementsByTagName('li') as $li) {
    $parents[] = $li->parentNode;
}

В конце мне нужно просто добавить класс для каждого родителя, например

foreach($parents as $key => $parent) {
     $parent->setAttribute('class', 'prefix_'.$key);
}

, и я хотел бы получить вывод

<div class="prefix_0">
...
</div>
<section class="prefix_1">
...
</section>
<div class="prefix_2">
...
</div>

Но я получаю

<div class="prefix_0 prefix_1">
...
</div>
<section class="prefix_2 prefix_3 prefix_4">
...
</section>
<div class="prefix_5 prefix_6 prefix_7 prefix_8">
...
</div>

Если я добавлю условие

if(!in_array($paragraph->parentNode, $parents)) {

, оно не будет работать, как я вижу, потому что у нас есть не массив, а список узлов

Таккак избежать добавления одного и того же родителя?

1 Ответ

0 голосов
/ 23 февраля 2019

Очень простая функция, чтобы избежать этого:

function compareParentNode($compare_node,$parents){
   foreach($parents as $parent){
       if ($parent->isSameNode($compare_node)) return true;
   }
   return false;
}

Использование:

$parents = [];
foreach($dom->getElementsByTagName('p') as $paragraph) {
   $parentNode = $paragraph->parentNode;
   if (!compareParentNode($parentNode,$parents)){   
      $parents[] = $paragraph->parentNode;
   }
}

Подробнее isSameNode

...