0

SimpleXMLでノードをエコーアウトする前に、ノードのリストをアルファベット順に並べ替えようとしています。ここで参照されているものと同様のusort関数を使用しています。

SimpleXMLおよびPHPのXpathによって返される結果のソート

これが私のコードです:

$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>

ご覧のとおり、アルファベット順ではありません。私は何かが足りないのですか?どんな助けでも大歓迎です。

4

1 に答える 1

3

usort質問をすばやく見ると、タイプのオブジェクトで使用しているように見えますSimpleXMLElement。ただし、この関数は配列に使用することを目的としています。

おそらく、最初にオブジェクト(またはより正確にはそれが提供するイテレータ)を配列に変換することで問題が解決するはずです。

説明:リンクした例では、xpathすでにを返す関数が使用されていますがarray、ここではそうではありません。

提供されたイテレータを配列に変換する関数は次のiterator_to_arrayとおりです。

$array = iterator_to_array($xQuery, false);

usort($array, "cmp");

foreach ($array as $comic) ...
于 2012-09-30T18:43:39.863 に答える