使用PHP实现XML的逆序
我正在使用PHP从XML文件输出数据。它默认按时间顺序排列,我想颠倒一下。这在PHP中是可能的吗?如果是,怎么做 这是我的密码:使用PHP实现XML的逆序,php,xml,Php,Xml,我正在使用PHP从XML文件输出数据。它默认按时间顺序排列,我想颠倒一下。这在PHP中是可能的吗?如果是,怎么做 这是我的密码: $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
$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>';
}
}
$file='1!'http://www.gostanford.com/data/xml/events/m-baskbl/2010/index.xml';
$xml=simplexml\u load\u文件($file);
foreach($xml作为$event\u date){
如果(!empty($event\u date->event['vn'])&&&!empty($event\u date->event['hn'])&&!empty($event\u date->event['vs'])&&&!empty($event\u date->event['hs']))
{
回音“”;
回显“”,$event_date->event['vn'],'vs',$event_date->event['hn'],'';
回显“”、$event\u date->event['vs']、“-”、$event\u date->event['hs']、“”;
回音“”,日期('fj,Y',strottime($event_date['date']),“”;
回音“ ”;
}
}
谢谢你的帮助 显然,您可以将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>';
}
foreach($xml作为$event\u date){
如果(!empty($event\u date->event['vn'])&&&!empty($event\u date->event['hn'])&&!empty($event\u date->event['vs'])&&&!empty($event\u date->event['hs']))
{
$my[]=数组(
“vn”=>$event_date->event['vn'],
“hn”=>$event\u date->event['hn']
...
);
}
}
对于($i=count($my)-1;$i>=0;$i--){
回音“”;
回音“,$my[$i]['vn'],'vs',$my[$i]['hn'];
...
回音“ ”;
}
希望这有帮助,它可能需要修复。如果
$xml
只是一个数组,您可以使用array\u 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
}
正如第一个答案所指出的,对于大型XML文档来说,这可能不是一个好主意。PHP5.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>';
}
}
?>
event['vn'])&&!空($event_date->event['hn'])&&!空($event_date->event['vs'])&&!空($event_date->event['hs']))
{
回音“”;
回显“”,$event_date->event['vn'],'vs',$event_date->event['hn'],'';
回显“”、$event\u date->event['vs']、“-”、$event\u date->event['hs']、“”;
回显“”、$event_date['date']、“”;
回显“”,$event\u date->event['local\u time'”,“”;
回音“ ”;
}
}
?>
是否可以反转输出而不是xml?即:
$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;
}
$arr=array();
foreach($xml作为$event\u date){
如果(!empty($event\u date->event['vn'])&&&!empty($event\u date->event['hn'])&&!empty($event\u date->event['vs'])&&&!empty($event\u date->event['hs']))
{
$strLine=“”;
$strLine.='li>';
$strLine.=''.$event\u date->event['vn'].'vs'.$event\u date->event['hn'.';
$strLine.='。$event_date->event['vs'].-'.$event_date->event['hs'].';
$strLine.=''.$event_date['date'].';
$strLine.=''.$event\u date->event['local\u time'].';
$strLine.='';
$arr[]=$strLine;
}
}
$arr=阵列_反向($arr);
foreach($arr作为$line)
{
回声线;
}
谢谢您的回复。不幸的是,这会生成此错误:警告:array_reverse()[function.array reverse]:参数应该是第14行的数组xml对象实际上不是数组。它实现了可遍历,因此可以在foreach中使用,但不能将其视为数组?列表没有那么长-最多可能200-300行。这似乎对我不起作用。我需要它以相反的时间顺序出现。您知道如何使其工作吗?很抱歉,响应太晚,您可以根据需要对数组进行排序。@Erik Nedwidek-谢谢,是的,我正在使用simplexml\u load\u文件和外部XML文件,并更新了我的问题以显示这一点。我似乎无法使您的代码正常工作-是否需要将simplexml\u load\u文件更改为使用simplexmlelement?@Ryan-您不需要对simplexml\u load\u文件执行任何操作。如果成功加载xml文件,则返回SimpleXMLElement对象(失败时为false)。在第二个foreach中,$xml需要是$xmlArray。(修复了原始答案)@Erik Nedwidek当我尝试您的更新答案时,我得到以下消息:致命错误:未捕获异常“exception”,消息为“String无法解析为XML”。知道我做错了什么吗?谢谢。@Ryan-一点也不知道。我在Fedora 14上使用PHP5.3.6。输出“PHP-v”:PHP5.3.6(cli)(构建时间:2011年3月17日20:58:15)@Erik Nedwidek您能编辑您的答案并添加simplexml加载文件吗?XML文件URL在我编辑的答案中。谢谢。谢谢。但是在你的例子中有几个语法错误,我不知道如何纠正。你能编辑你的代码吗?@Ryan抱歉。仍然在javascript模式下使用“var”。除了在我的IDE上检查所有内容之外。您是否遇到了具体错误?在Dreamweaver中,li中的四条strLine被标记为不正确。当我上传你的代码时,我得到了这个错误:解析错误:语法错误,意外','在线19@Ryan,好的,应该是固定的。