2012-09-30 51 views
0

我试图按字母顺序对节点列表进行排序,然后在SimpleXML中回显它们。我使用一个类似这里引用的usort功能:Usort不完全排序

Sorting Results returned by SimpleXML, and Xpath in PHP

这里是我的代码:

$xQuery = $xml->comiclist->comic; 

function cmp ($a, $b) { 
    return strcmp(
     $a->mainsection->series->sortname, 
     $b->mainsection->series->sortname 
    ); 
} 

usort($xQuery, "cmp"); 

foreach ($xQuery as $comic) : 

的问题是,它只是似乎是部分加工。大多数项目都正确分组,但有些完全不合适。从函数中可以看到,每个$ comic节点都按其子节点“mainsection-> series-> sortname”进行排序。

下面是一些它的生成顺序的一个例子:

<sortname>New Avengers: Illuminati, Vol. 2</sortname> 
<sortname>New Avengers: Illuminati, Vol. 2</sortname> 
<sortname>Nova</sortname> 
<sortname>New X-Men</sortname> 
<sortname>Nation X</sortname> 
<sortname>Namor, The Sub-Mariner Annual</sortname> 

正如你可以看到,他们不是按字母顺序排列。我错过了什么吗?任何帮助表示赞赏。

回答

3

从快速查看你的问题,它看起来像你正在使用usortSimpleXMLElement类型的对象。但是该函数旨在用于数组。

可能将对象(或更确切地说它提供的迭代器)转换为数组首先应解决您的问题。

说明:在这个例子中你联系,xpath功能用于其已经返回array,在这里你的例子事实并非如此。

的函数把所提供的迭代器的阵列是iterator_to_array

$array = iterator_to_array($xQuery, false); 

usort($array, "cmp"); 

foreach ($array as $comic) ... 
+1

注:* $ use_keys *参数需要被设置到否则返回FALSE阵列只会有一个条目。我错过了。 – hakre

+0

有道理。感谢澄清! – Batfan

+0

还有一件事,我在回复数据以从前一节点和下一节点获取一些数据之前正在使用xpath查询。这工作正常,除了它似乎没有拿起这个新的排序顺序。你可以在这里看到代码http://db.tt/J1ZOLeKN有什么想法? – Batfan