按属性按字母顺序排列 SimpleXML 数组

Order alphabetically SimpleXML array by attribute

我需要一些帮助来使用其中一个属性($url)按字母顺序对 SimpleXML 数组进行排序。我有以下生成页面的代码:

<?php
$xml = simplexml_load_file($xml_url);
$ids = array();

foreach($xml->list as $id) {
   $ids[] = $id;
}

//It works but randomize instead of sorting alphabetically
usort($ids, function ($a, $b) {
   return strnatcmp($a['url'], $b['url']);
});

foreach ($ids as $id) {
   PopulatePage($id);
}

function PopulatePage($id) {
   $url = $id->url;
   $img = $id->img;
   //OTHER CODES TO GENERATE THE PAGE
}?>

问题已解决!

不需要转换,您已经有了一个可以排序的数组,您只需要了解 usort 回调的工作原理。 $ids 数组中的每一项都是一个 SimpleXMLElement 对象,每次回调为 运行 时,都会给其中两个对象进行比较。这些对象将与现有 PopulatePage 函数中的对象完全相同,因此访问 URL 需要完全按照它在那里的方式进行 ($url = $id->url;),而不是使用不同的表示法 ($id['url'])。

为了让它更明确,让我们写一个有很多明确变量名的命名函数:

function CompareTwoIds(SimpleXMLElement $left_id, SimpleXMLElement $right_id): int {
    $left_url = $left_id->url;
    $right_url = $right_id->url;
    return strncatcmp($left_url, $right_url);
}

现在您可以测试手动调用该函数,并在您满意时将其用作回调:

usort($ids, 'CompareTwoIds');

一旦您对这些原则感到满意,您可能会决定跳过多余的冗长内容而只写这个,这完全等同于:

usort($ids, fn($a,$b) => strncatcmp($a->url, $b->url));