按属性按字母顺序排列 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));
我需要一些帮助来使用其中一个属性($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));