Как получить список из xpath?

436
.

Всем привет, возникла такая вот проблемма. Необходимо получить данные из div блока с помощью xpath
<div class="reports">
<div class="ERROR">
<div class="name"></div>
<div class="author"></div>
</div>
<div class="SUCCESS">
<div class="name"></div>
<div class="author"></div>
</div>
<div class="SUCCESS">
<div class="name"></div>
<div class="author"></div>
</div>
<div class="ERROR">
<div class="name"></div>
<div class="author"></div>
</div>
<div class="SUCCESS">
<div class="name"></div>
<div class="author"></div>
</div>
</div>

Начало запроса составил так

$xpath = new DOMXpath( $doc );
$results = $xpath->query( '//div[@class="reports"]' );

Я понимаю что нужно использовать foreach но как не могу понять и разобраться, при этом мне нужно получить значения атрибута name если это находится в блоке div class="SUCCESS" И значение атрибута author если это блок div class="ERROR" ? Готов отблагодарить за помощь.

.
ДоХтор
Eniken Svarovski ? )
Там завтра наверняка ответят.
.

ДоХтор, Привет ДоХтор)

.
# Энштеин (09.10.2017 / 23:31)
ДоХтор, Привет ДоХтор)
Привет ) Я не использую все эти либы, поэтому подсказать не могу. Мне для подобных задач хватает регулярных выражений.
.

ДоХтор, Регулярка при большом обьеме просто зависнет

.
ДоХтор
# Энштеин (09.10.2017 / 23:34)
ДоХтор, Регулярка при большом обьеме просто зависнет
Буквально сегодня на SO видел чей-то пост "Почему не получается обогнать регулярное выражение?" -- в пхп 7 регулярки отрабатывают намного быстрее всяческих костылей без регулярок. И потом, регулярки тоже можно писать криво, или правильно.
.
# ДоХтор (09.10.2017 / 23:37)
Буквально сегодня на SO видел чей-то пост "[url=https://ru.stackoverflow.com/questions/728446/%d0%9f%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%bd%d0%b5-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b0%d0%b5%d1%82%d1%81%d
ну дай на регулярке совет как сделать
.
Добавлено: 09.10.2017 / 23:45
# Энштеин (09.10.2017 / 23:42)
ну дай на регулярке совет как сделать
Сперва уточни задачу - что уже есть? Тот набор дивов, что в первом посту? Если да, то что из них тебе надо получить? Если ответы на мои вопросы уже есть, то просто скопируй их в последующий за моим пост.

Добавлено: 09.10.2017 / 23:49
Ага, я вроде понял, что тебе надо. Сейчас подумаю.
.

Энштеин, Тебе то, что выделено жирным, надо получить?

<div class="ERROR">
<div class="name"></div>
<div class="author">Необходимый текст 1</div>
</div>
<div class="SUCCESS">
<div class="name">Необходимый текст 2</div>
<div class="author"></div>
</div>

.
(\/)____o_O____(\/)

Энштеин,

код (+/-)
$doc = '
    <div class="reports">
        <div class="ERROR">
            <div class="name">5555</div>
            <div class="author">6666</div>
        </div>
        <div class="SUCCESS">
            <div class="name">444</div>
            <div class="author">777</div>
        </div>
        <div class="SUCCESS">
            <div class="name">888</div>
            <div class="author">999</div>
        </div>
        <div class="ERROR">
            <div class="name">000</div>
            <div class="author">111</div>
        </div>
        <div class="SUCCESS">
            <div class="name">333</div>
            <div class="author">222</div>
        </div>
    </div>
';


$dom = new DOMDocument();
$dom->loadHTML($doc);

$xpath = new DOMXpath($dom);
$elements = $xpath->query( '//div[@class="reports"]/div');

$result = [];

foreach ($elements as $k => $element) {
    foreach ($element->getElementsByTagName('div') as $item) {
        $result[$element->getAttribute('class')][$item->getAttribute('class')][] = $item->textContent;
    }
}

echo '<pre>' . print_r($result, true) . '</pre>';

вывод (+/-)

Array
(
[ERROR] => Array
(
[name] => Array
(
[0] => 5555
[1] => 000
)

[author] => Array
(
[0] => 6666
[1] => 111
)

)

[SUCCESS] => Array
(
[name] => Array
(
[0] => 444
[1] => 888
[2] => 333
)

[author] => Array
(
[0] => 777
[1] => 999
[2] => 222
)

)

)
Всего: 16