使用PHP反转XML的顺序

时间:2011-05-11 19:38:34

标签: php xml

我正在使用PHP从XML文件输出数据。这是违反时间顺序的,我想反过来。这可能用PHP吗?如果是这样,怎么样?

这是我的page和代码:

    $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>';   
        }
    }

感谢您的帮助!

4 个答案:

答案 0 :(得分:6)

正如第一个答案所指出的,这对于大型XML文档来说可能不是一个好主意。 PHP 5.1.2及更高版本的最简单和最可移植的代码可能是使用SimpleXML。它可能已经内置到早期的PHP版本中,但它在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>';
    }
}


?>

答案 1 :(得分:2)

如果$xml只是一个数组,您可以使用array_reverse($xml)来反转它:

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

但是,如果它很长,那可能效率不高。您可以使用带有递减索引的手动for循环:

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

答案 2 :(得分:1)

显然,您可以将xml读取到数组并以相反的顺序打印。但是,这可能不是一个很长的清单。

修改

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>';
}

希望这有帮助,可能需要修复。

答案 3 :(得分:1)

你可以反转输出而不是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;
    }