PHP: простой парсер DOM, как перебирать html-код

<div class = "reviews-summary__stats">
    <div class = "reviews-summary">
        <p class = "reviews-title">C</p>
        <ul class = "rating">
            <li class = "rating__item rating__rated"></li>
            <li class = "rating__item rating__rated"></li>
            <li class = "rating__item rating__rated"></li>
            <li class = "rating__item "></li>
            <li class = "rating__item "></li>
        </ul>
    </div>
    <div class = "reviews-summary">
        <p class = "reviews-title">C</p>
        <ul class = "rating">
            <li class = "rating__item rating__rated"></li>
            <li class = "rating__item rating__rated"></li>
            <li class = "rating__item rating__rated"></li>
            <li class = "rating__item rating__rated"></li>
            <li class = "rating__item "></li>
            <li class = "rating__item "></li>
        </ul>
    </div>
    <div class = "reviews-summary">
        <p class = "reviews-title">C</p>
        <ul class = "rating">
            <li class = "rating__item rating__rated"></li>
            <li class = "rating__item rating__rated"></li>
            <li class = "rating__item "></li>
            <li class = "rating__item "></li>
        </ul>
    </div>     
</div>

Я хочу перебрать каждый div.reviews-summary, но я не добираюсь до следующего тега p.reviews-title и li.rating__item rating__rated, а также подсчитываю li.rating__item rating__rated для отображения li.rating__item rating__rated в целых числах.

<?php
    include("simple_html_dom.php");
    $obj = new simple_html_dom();

    foreach ($obj->find('div[class=reviews-summary]') as $factor)
    {
        $item = $factor->find('p[class=reviews-title]')->plaintext;

        if (trim($item) == 'A')
        { 
            $a = $factor->find('li[class=rating__item rating__rated]',0)->plaintext;
        }
        if (trim($item) == 'B')
        { 
            $b = $factor->find('li[class=rating__item rating__rated]',0)->plaintext;
        }
        if (trim($item) == 'C')
        { 
            $c = $factor->find('li[class=rating__item rating__rated]',0)->plaintext;
        }
        $final_array['overalldata'] = array
        (
            'a' => $a,   // no of A have <li class = "rating__item rating__rated"></li> 
            'b' => $b,
            'c' => $c,
        );
    }
    print_r($final_array);
    die;
?>

я хочу отображать как этот тип вывода, Множество ( [overalldata] => Массив ( [a] => 3
[b] => 4
[c] => 2
) )
а также подсчитать его li.rating__item rating__rated, и отобразить целочисленное значение отсутствия li.rating__item rating__rated в списке

Любой орган, имеющий какое-либо представление, пожалуйста, помогите разобраться в этом. Спасибо

Куда вы загружаете HTML?

Nigel Ren 03.05.2018 08:45

Взгляните на PHP DomDocument

CK Wong 03.05.2018 08:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я внес пару изменений, но включил несколько версий, поскольку они по-разному форматируют данные. Я думаю, что основная проблема заключалась в том, что когда вы используете find(), это может возвращать список найденных элементов, поэтому при настройке $a и т. д. Вы использовали второй параметр для выбора plaintext первого элемента (используя ,0), вы этого не сделали. Не делайте этого при поиске значения $item. Так что я добавил то же самое к этому призыву.

$final_array=array();
foreach ($obj->find('div[class=reviews-summary]') as $factor)
{
    $item = $factor->find('p[class=reviews-title]',0)->plaintext;
    if (trim($item) == 'A')
    {
        $final_array['overalldata']['a'] = $factor->find('li[class=rating__item rating__rated]',0)->plaintext;
    }
    if (trim($item) == 'B')
    {
        $final_array['overalldata']['b'] = $factor->find('li[class=rating__item rating__rated]',0)->plaintext;
    }
    if (trim($item) == 'C')
    {
        $final_array['overalldata']['c'] = $factor->find('li[class = "rating__item rating__rated"]',0)->plaintext;
    }
}
print_r($final_array);

Это дает (с вашими образцами данных) ...

Array
(
    [overalldata] => Array
        (
            [c] => 
        )

)

В качестве альтернативы ...

$final_array=array();
foreach ($obj->find('div[class=reviews-summary]') as $factor)
{
    $a = null;
    $b = null;
    $c = null;
    $item = trim($factor->find('p[class=reviews-title]',0)->plaintext);
    $factor = $factor->find('li[class=rating__item rating__rated]');
    $count = count($factor);
    if ($item == 'A')
    {
        $a = $factor[0]->plaintext;
    }
    if ($item == 'B')
    {
        $b = $factor[0]->plaintext;
    }
    if ($item == 'C')
    {
        $c = $factor[0]->plaintext;
    }
    $final_array['overalldata'] = array
    (
        'a' => $a,
        'b' => $b,
        'c' => $c,
        'count' =>$count
    );
}
print_r($final_array);

При немного измененном наборе тестовых данных дает ...

Array
(
    [overalldata] => Array
        (
            [a] => 
            [b] => 
            [c] => Some content
        )

)

Обновлять:

Я обновил второй пример, я перенес часть общего кода в основную часть. $count - это просто количество элементов <li class = "rating__item rating__rated"> (я думаю, это то, о чем вы просите).

спасибо @nigel ren, небольшая проблема решена, я также считаю li [class = rating__item rating__rated], чтобы отобразить рейтинг

Parasmal Prajapati 03.05.2018 10:06

Извините - не понимаю, что вы имеете в виду под второй частью.

Nigel Ren 03.05.2018 10:13

я отображаю как этот тип вывода, Массив ([overalldata] => Массив ([a] => 4 [b] => 4 [c] => 4)), а также, если li.rating__item rating__rated, тогда подсчитайте его и отобразите целочисленное значение no li.rating__item rating__rated существует в списке

Parasmal Prajapati 03.05.2018 10:20

Я изменил второй пример кода, посмотрите, поможет ли это.

Nigel Ren 03.05.2018 10:20

решение, пожалуйста :) @nigel ren

Parasmal Prajapati 03.05.2018 10:36

Другие вопросы по теме