Php 如何使用SimpleXML对XML提要进行排序

Php 如何使用SimpleXML对XML提要进行排序,php,xml,simplexml,Php,Xml,Simplexml,我已经开始使用simplexml函数,它似乎比我之前尝试使用的其他解析器运行得更好。我已经到了需要对项目进行排序的阶段 通过transmissiondate-我尝试使用uasort,但没有对项目的顺序进行任何更改 还有一些时候,一个节目在同一天播出不止一次——用videoID点播会更容易吗 这是对象的外观: [0] => SimpleXMLElement Object ( [VideoID] => 108059 [Genre] => Mu

我已经开始使用simplexml函数,它似乎比我之前尝试使用的其他解析器运行得更好。我已经到了需要对项目进行排序的阶段 通过transmissiondate-我尝试使用uasort,但没有对项目的顺序进行任何更改

还有一些时候,一个节目在同一天播出不止一次——用videoID点播会更容易吗

这是对象的外观:

[0] => SimpleXMLElement Object
    (
        [VideoID] => 108059
        [Genre] => Music
        [ProgrammeName] => MTV
        [OriginalAiringDate] => 2009-11-10T19:22:24
        [TransmissionDate] => 2009-11-10T19:22:24
   )
[1] => SimpleXMLElement Object
    (
        [VideoID] => 108395
        [ExpiryDate] => 2009-12-12T23:59:59
        [DateCreated] => 2009-11-12T13:28:54
        [Genre] => Music
        [ProgrammeName] => MTV
        [OriginalAiringDate] => 2009-11-12T19:22:32
        [TransmissionDate] => 2009-11-12T19:22:32
 )

$xml = simplexml_load_file("data.xml");
$count = 0;
$sortItem = 0;
$dateformat = "D j M, g:ia";
$sortArray = array();
foreach($xml->CatchUp as $item){
$sortArray[$count][TransmissionDate] = $item;
if($count < 4){
print "<p>Programme Name:<strong> "  . $item->ProgrammeName. "</strong></p>";
print "<p>Date Shown:<strong> "  . date($dateformat, strtotime($item->TransmissionDate)). "</strong></p>";
print "<p>Description:<strong> " . trunc($item->ShortSynopsis,30, " ")."</strong></p>";
print "<p><a href='". $item->VideoID. "'>". $item->VideoID."</a></p>";
         $count++;
  }
}
[0]=>SimpleXMLElement对象
(
[VideoID]=>108059
[流派]=>音乐
[节目名称]=>MTV
[originalairengdate]=>2009-11-10T19:22:24
[TransmissionDate]=>2009-11-10T19:22:24
)
[1] =>SimpleXMLElement对象
(
[VideoID]=>108395
[过期日期]=>2009-12-12T23:59:59
[DateCreated]=>2009-11-12T13:28:54
[流派]=>音乐
[节目名称]=>MTV
[originalairengdate]=>2009-11-12T19:22:32
[TransmissionDate]=>2009-11-12T19:22:32
)
$xml=simplexml\u加载文件(“data.xml”);
$count=0;
$sortItem=0;
$dateformat=“D j M,g:ia”;
$sortArray=array();
foreach($xml->CatchUp as$item){
$sortArray[$count][TransmissionDate]=$item;
如果($count<4){
打印“程序名:”$item->ProgrammeName。”

”; 打印“显示的日期:”。日期($dateformat,strotime($item->TransmissionDate))。“

”; 打印“说明:”.trunc($item->shortsymposis,30“”)。”; 打印“

”; $count++; } }
}


asort($sortArray)

从SimpleXMLElement对象提取数据时,请尝试使用强制转换


使用视频id:
$sortArray[$count][VideoID]=(int)$item

我看到两种方法。第一种方法是创建一个包含
TransmissionDate
值的数组,然后创建另一个包含相应节点的数组,然后使用
array\u multisort()
。这有点乏味,所以我要做的是:下载并使用
sortedXPath()

包括“SimpleDOM.php”;
$xml=simpledom_load_文件(“data.xml”);
$dateformat=“D j M,g:ia”;
foreach($xml->sortedXPath('CatchUp[ProgrammeName=“MTV”]”,'TransmissionDate')作为$i=>$item)
{
如果($i==4)
{
//我想你只想要前4个
打破
}
打印“程序名:”$item->ProgrammeName。”

”; 打印“显示的日期:”。日期($dateformat,strotime($item->TransmissionDate))。“

”; 打印“说明:”.trunc($item->shortsymposis,30“”)。”; 打印“

”; }
感谢cedko80,它实际上不起作用了。foreach($xml->CatchUp as$item){$sortArray[$count]['VideoID']=(int)$item;if($count<4){……$count++;}}asort($sortArray)太棒了,乔希,如果我想按名称过滤,比如说只显示前4个MTV节目,那就有一个小问题。就像($item->program==“MTV”){}它似乎会中断第一个参数是XPath表达式
CatchUp
表示“名为
CatchUp
的所有子节点”-您可以添加一个谓词,例如:
CatchUp[ProgrammeName=“MTV”]
,它将其转换为“名为
CatchUp
的所有子节点都有一个名为
ProgrammeName
的子节点,其值为
'MTV'
”-请参阅谈论XPath,我还应该提到,通过添加谓词
[position(),您可以使用它将搜索限制在前N项似乎每次我通过拉一个特定的显示来过滤数据时,排序机制都不起作用-XPath中有没有一种方法可以指定排序顺序,因为它现在以相反的顺序显示内容。让你的data.xml在某处可用,我来看看。如果这是SimpleDOM中的一个bug,请在Google代码中提交一个bug。
include 'SimpleDOM.php';

$xml = simpledom_load_file("data.xml");
$dateformat = "D j M, g:ia";

foreach($xml->sortedXPath('CatchUp[ProgrammeName="MTV"]', 'TransmissionDate') as $i => $item)
{
    if ($i == 4)
    {
        // I assume you only want the first 4
        break;
    }
    print "<p>Programme Name:<strong> "  . $item->ProgrammeName. "</strong></p>";
    print "<p>Date Shown:<strong> "  . date($dateformat, strtotime($item->TransmissionDate)). "</strong></p>";
    print "<p>Description:<strong> " . trunc($item->ShortSynopsis,30, " ")."</strong></p>";
    print "<p><a href='". $item->VideoID. "'>". $item->VideoID."</a></p>";
}