Search code examples
phphtmlsimple-html-dom

PHP : DOM Parser to iterate html code


<div class="reviews-summary__stats">
                <div class="reviews-summary">
                    <p class="reviews-title">A</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">B</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 rating__rated"></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>

i want to iterate over each div.reviews-summary but i am not getting to next p.reviews-title and li.rating__item rating__rated tag, and also count the li.rating__item rating__rated for separate p tag, and display integer value of no of li.rating__item rating__rated that are exist in ul.and also check if A exist then display li.rating__item rating__rated of A.

<?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;
?>

i want display like this type of output, Array ( [overalldata] => Array ( [a] => 4
[b] => 5
[c] => 4
) )

Any body having any idea please help to sort it out. Thanks


Solution

  • Your HTML is (hopefully) slightly wrong. You have three sets of <p class="reviews-title">C</p>, so all items are 'C'. But if you replace them with A and B, you could use the following code.

    All it does is to store a count of the number of li[class=rating__item rating__rated] items under the index of the lower case version of the <p class="reviews-title"> value...

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

    I've updated the HTML to (so just replacing the A and B)...

    <div class="reviews-summary__stats">
        <div class="reviews-summary">
            <p class="reviews-title">A</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">B</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>
    

    This outputs...

    Array
    (
        [overalldata] => Array
            (
                [a] => 3
                [b] => 4
                [c] => 2
            )
    
    )