1
<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

1 Answer 1

1

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
        )

)
Sign up to request clarification or add additional context in comments.

12 Comments

look output,all have separate print, so do not print all in one
I've added the output to the answer, it looks just like the output in the question.
it look like this type of answer Array ( [overalldata] => Array ( [] => 4 ) ) ,and look i edit html so try
Can you change [strtolower($item)] to [$item] and see what that does.
If the last bit gives you some output, try changing strtolower to mb_strtolower as this should work with different string encoding.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.