Search code examples
phpxmlsimplexml

PHP Output my XML feed in a random order


I have my XML output working fine but it's in latest date order. What would be cool is if I could get it in a random order. I've tried using shuffle and I just can't get it working (nothing seems to happen).

Here's an example of the code I'm using to build my XML. The output is HTML with PHP to insert variables.

    // Build the Feed
    $feed   = "http://www.reviewswebsite.com/api/consumer-reviews/?username=" . $userName . "&format=xml&reviews_per_page=20&page=" . $pageNumber;
    $xml    = simplexml_load_file($feed);

    for($i = 0; $i < $numberOfForLoops; $i++)
    {
        $reviewer_name                = $xml->reviews->review[$i]->reviewer_name;
        $date_of_work                 = date('l, d m Y' , strtotime($xml->reviews->review[$i]->date_of_work));
        $average_reviewer_rating      = (float)$xml->reviews->review[$i]->average_rating;
    ..
    ?>
    <div><?php  echo $reviewer_name; ?></div>
...

        <?php ;} ?>

Solution

  • @The Fourth Bird helped me by passing this link: Randomize SimpleXML object results

    The end result I created for Trust-A-Trader reviews which I built into a Joomla! module was. I'll try to release the module for free on the Joomla! Extensions Directory (JED).

    End code was

    $feed = "http://www.trustatrader.com/api/consumer-reviews/?username=" . $userName . "&format=xml&reviews_per_page=20&page=" . $pageNumber;
    $xml = simplexml_load_file($feed);
    
        // Count Reviews, if total number of reviews is less than the total shown on page set in module then show the lesser amount to avoid an error.
        $totalNumberOfReviews = count($xml->reviews->review);
        $numberOfForLoops = $totalNumberOfReviews;
        if ($totalNumberOfReviews > $numberOfReviews) {
            $numberOfForLoops = $numberOfReviews;
        }
    
    
        // If the module sets the order to random then shuffle array, or else do in latest first date order.
        if ($params->get('Order') == 0) {
            foreach($xml->reviews->review as $val)
                $array[]= $val;
    
            shuffle($array);
        }
    
    
        // Loop through the reviews and output them.
        foreach($array as $val)
        {
            $i = 0;
            if ($i < $numberOfForLoops)
            {
                ?>
                <div class="mod_trust_a_trader_reviews--review g-grid" itemscope itemtype="http://schema.org/Review" itemprop="review" >
                    <div class="review g-block size-100" itemprop="reviewBody">
                        <?php echo $val->comments; ?>
                    </div>
                    <div class="authorBlock g-grid size-100">
                    <span class="author g-block size-100" itemprop="author">
                        <?php echo $val->reviewer_name; ?>
                    </span>
                    </div>
                    <div class="score g-block size-100 g-grid">
                        <div class="g-block size-100">
                            <?php starRatingImage($val->average_rating); ?>
                        </div>
                        <div class="g-block size-100 reviewRating">
                            <?php echo '(<span  itemprop="reviewRating">' . $val->average_rating . '</span>)'; ?>
                        </div>
                    </div>
                </div>
                <?php
            }
    
            $i++;
        }
    
    ?>