Reverse XML Order Using PHP

I use PHP to output data from an XML file. This defaults to the chronological order that I would like to cancel. Is this possible with PHP? If so, how?

Here is my page and code:

    $file = 'http://www.gostanford.com/data/xml/events/m-baskbl/2010/index.xml';
    $xml = simplexml_load_file($file);

        foreach ($xml as $event_date) {
        if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs']))
        { 
            echo '<li>';
                echo '<h3>', $event_date->event['vn'], ' vs ', $event_date->event['hn'], '</h3>';
                echo '<p><strong>', $event_date->event['vs'], ' - ', $event_date->event['hs'], '</strong></p>';
                echo '<p>', date('F j, Y', strtotime($event_date['date'])), '</p>';
            echo '</li>';   
        }
    }

Thank you for your help!

+3
source share
4 answers

As you can see from the first answer, this might not be a good idea for large XML documents. The simplest and most portable code for PHP 5.1.2 and later might be using SimpleXML. It may have been built into earlier versions of PHP, but it is standard after 5.1.2.

<?php

$file = 'http://www.gostanford.com/data/xml/events/m-baskbl/2010/index.xml';
$xml = simplexml_load_file($file);

if ($xml === false) {
  echo "Couldn't load file\n";
  exit (1);
}

$xmlArray = array();

foreach ($xml as $event_date) $xmlArray[] = $event_date;

$xmlArray = array_reverse($xmlArray);

foreach ($xmlArray as $event_date) {
    if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs']))
    {
            echo '<li>';
                echo '<h3>', $event_date->event['vn'], ' vs ', $event_date->event['hn'], '</h3>';
                echo '<p><strong>', $event_date->event['vs'], ' - ', $event_date->event['hs'], '</strong></p>';
                echo '<p>', $event_date['date'], '</p>';
                echo '<p>', $event_date->event['local_time'], '</p>';
            echo '</li>';
    }
}


?>
+6
source

, xml . , .

EDIT:

foreach($xml as $event_date){
    if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs']))
    { 
        $my[]=array (
             "vn" => $event_date->event['vn'],
             "hn" => $event_date->event['hn']
             ...
        );
    }
}

for($i=count($my)-1;$i>=0;$i--) {
    echo '<li>';
        echo '<h3>', $my[$i]['vn'], ' vs ', $my[$i]['hn'];
        ...
    echo '</li>';
}

, , , .

+1

$xml - , array_reverse($xml) :

foreach (array_reverse($xml) as $event_date) {
  // etc
}

But if it is long, it can be inefficient. You can use a manual loop with decrementing indices:

for ($i = sizeof($xml) - 1; $i >= 0; --$i) {
  // use $xml[$i] to access each element
}
+1
source

Can you change your output instead of xml? IE:

  $arr = array();
  foreach($xml as $event_date){
        if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs']))
        { 
        $strLine = "";
        $strLine .= '<li>';
        $strLine .= '<h3>'. $event_date->event['vn']. ' vs '. $event_date->event['hn']. '</h3>';
        $strLine .= '<p><strong>'. $event_date->event['vs']. ' - '. $event_date->event['hs']. '</strong></p>';
        $strLine .= '<p>'. $event_date['date']. '</p>';
        $strLine .= '<p>'. $event_date->event['local_time']. '</p>';
        $strLine .= '</li>';   
        $arr[] = $strLine;
        }
    }
    $arr = array_reverse($arr);
    foreach ($arr as $line)
    {
        echo $line;
    }
+1
source

All Articles