PHP: простой DOM Parser, как перебирать HTML-код - PullRequest
0 голосов
/ 03 мая 2018
<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;
?>

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

Если у вас есть идея, пожалуйста, помогите разобраться. Спасибо

1 Ответ

0 голосов
/ 03 мая 2018

Я внес пару изменений, но включил пару версий, так как они по-разному форматируют данные. Я думаю, что основная проблема заключалась в том, что когда вы используете 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"> элементов (я думаю, это то, что вы просите).

...