我已经阅读了我在 Stackoverflow 上找到的内容,但对此仍然不清楚。
我有一个类似这样的 SimpleXML 对象数组:
array(2) {
[0]=>
object(SimpleXMLElement)#2 (2) {
["name"]=>
string(15) "Andrew"
["age"]=>
string(2) "21"
}
[1]=>
object(SimpleXMLElement)#3 (2) {
["name"]=>
string(12) "Beth"
["age"]=>
string(2) "56"
}
}
而且我希望能够按任何列(升序或降序)进行排序。像这样的东西:
sort($data, 'name', 'asc');
我可以在其中传递上面的对象数组并按我喜欢的任何键的值排序。
作为引用,类似的 .NET 解决方案应遵循以下原则:
XmlSortOrder order = XmlSortOrder.Ascending;
if ( sortDirection == "asc" ) {
order = XmlSortOrder.Ascending;
}
expression.AddSort( columnSortingOn + "/text()", order,
XmlCaseOrder.UpperFirst, "en-us", XmlDataType.Text );
我看到有人说
"Use usort"
后面是 PHP 手册中的一个基本示例,但这并没有真正解释它。至少对我来说不是。我也看到有人建议使用像 SimpleDOM 这样的外部库,但我想避免为此使用外部库(看起来,虽然我还不能解决它)小东西。
感谢任何帮助,谢谢!
最佳答案
我猜人们建议使用 SimpleDOM会是我。 :)
我已经为这种情况编写了 SimpleDOM::sort() ,因为为了通过仲裁表达式(或任意表达式)对 SimpleXMLElements 进行排序,您需要使用 array_multisort()
这很无聊,不会教给你任何有用的东西。
以下是其工作原理的简短版本:首先,您创建一个代理数组,其中包含对应于每个 SimpleXMLElement 的键=>值对以及用于对它们进行排序的值。在您的示例中,如果您想按 <age/>
对它们进行排序,数组将为 array(21, 56)
.然后你打电话array_multisort()
以“代理数组”作为第一个参数,后跟任意数量的 sorting modifiers例如 SORT_DESC 或 SORT_NUMERIC 最后是您要排序的数组,它将通过引用传递。
你最终会得到这样的结果:
$nodes = array(
new SimpleXMLElement('<person><name>Andrew</name><age>21</age></person>'),
new SimpleXMLElement('<person><name>Beth</name><age>56</age></person>')
);
function xsort(&$nodes, $child_name, $order = SORT_ASC)
{
$sort_proxy = array();
foreach ($nodes as $k => $node)
{
$sort_proxy[$k] = (string) $node->$child_name;
}
array_multisort($sort_proxy, $order, $nodes);
}
xsort($nodes, 'name', SORT_ASC);
print_r($nodes);
xsort($nodes, 'age', SORT_DESC);
print_r($nodes);
但实际上,与其让自己负担更多的代码,不如维护并可能最终重写 array_multisort()
在用户空间中,您应该利用现有的解决方案。这样的排序算法/例程没有什么有趣的,您的时间最好花在尚不存在的东西上。
关于php - 对 SimpleXML 对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2119686/