php - 对 SimpleXML 对象数组进行排序

标签 php sorting simplexml

我已经阅读了我在 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/

相关文章:

javascript - 日期范围选择器为 24 小时范围创建错误的时间值

php - 持久性 PDO mysql 连接替代方案

php - Facebook Connect Wall Posting 仅以弹出窗口形式出现。如何改变这一点?

algorithm - 如何将不稳定排序转换为稳定算法?

php - 如何解析具有ns2元素的xml

php服务器端打印

excel - 对有连字符的字母数字数据进行排序

javascript - HTML block 放置的逻辑

php - XML 中包含 "&"的字符串出错。我怎样才能解决这个问题?

php - 如何使用 php 在 XML 文件中搜索?