Usort没有完全排序

时间:2012-09-30 18:33:46

标签: php simplexml usort

我试图按字母顺序对节点列表进行排序,然后在SimpleXML中回显它们。我正在使用类似于此处引用的 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>

如您所见,它们不是按字母顺序排列的。我错过了什么吗?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

通过快速查看您的问题,您可能会在SimpleXMLElement类型的对象上使用usort。但是,该函数旨在用于数组。

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

  

说明:在您链接的示例中,使用的xpath函数已经返回array,在您的示例中并非如此。

将提供的迭代器转换为数组的函数是iterator_to_array

$array = iterator_to_array($xQuery, false);

usort($array, "cmp");

foreach ($array as $comic) ...