按子节点PHP SimpleXML排序xml div

时间:2011-11-25 21:03:11

标签: php simplexml

所以我在xml文件中有一个<div>的列表。我正在使用php的simpleXML

解析文件

我可以使用以下代码生成所有div的数组:

$divArray = $xmldoc->text->body->children();

但现在我想在div中通过不同的childNodes(作者,标题,日期)订购$ divArray。

div看起来像这样。

<div>
    <bibl>
       <author>
       <title>
       <date>
   </bibl>
</div>

那么如何才能获取$ divArray并按<author><title><date>对其进行排序?

感谢您的帮助。 JW

1 个答案:

答案 0 :(得分:5)

基本程序是

  1. SimpleXMLElement投射到数组
  2. 编写一个接受两个SimpleXMLElement参数的比较函数
  3. 使用usort()
  4. 对数组进行排序

    我只能猜测你原来的XML结构,但我觉得它看起来像这样:

    $xml = <<<EOT
    <root>
    <text>
        <body>
            <div>
                <bibl>
                    <author>A</author>
                    <title>A</title>
                    <date>1</date>
                </bibl>
            </div>
            <div>
                <bibl>
                    <author>B</author>
                    <title>B</title>
                    <date>2</date>
                </bibl>
            </div>
            <div>
                <bibl>
                    <author>D</author>
                    <title>D</title>
                    <date>4</date>
                </bibl>
            </div>
            <div>
                <bibl>
                    <author>C</author>
                    <title>C</title>
                    <date>3</date>
                </bibl>
            </div>
        </body>
    </text>
    </root>
    EOT;
    
    $xmldoc = new SimpleXMLElement($xml);
    

    第1步:转换为数组。请注意,您的 $divArray 实际上并不是数组

    $divSXE = $xmldoc->text->body->children(); // is a SimpleXMLElement, not an array!
    // print_r($divSXE);
    $divArray = array();
    foreach($divSXE->div as $d) {
        $divArray[] = $d;
    }
    // print_r($divArray);
    

    第2步:编写比较函数。由于数组是SimpleXMLElement的列表,因此比较函数必须接受SimpleXMLElement个参数。 SimpleXMLElement需要显式转换来获取字符串或整数值。

    function author_cmp($a, $b) {
        $va = (string) $a->bibl->author;
        $vb = (string) $b->bibl->author;
        if ($va===$vb) {
            return 0;
        }
        return ($va<$vb) ? -1 : 1;
    }
    

    第3步:使用usort()

    对数组进行排序
    usort($divArray, 'author_cmp');
    print_r($divArray);