按子节点对xml div排序PHP SimpleXML

按子节点对xml div排序PHP SimpleXML,php,simplexml,Php,Simplexml,因此,我有一个xml文件中的列表。我正在使用php的simpleXML解析该文件 我可以使用以下命令生成所有div的数组: $divArray = $xmldoc->text->body->children(); 但是现在我想按div中的不同子节点(作者、标题、日期)订购$divArray div看起来像这样 <div> <bibl> <author> <title> <d

因此,我有一个xml文件中的
列表。我正在使用php的simpleXML解析该文件

我可以使用以下命令生成所有div的数组:

$divArray = $xmldoc->text->body->children();
但是现在我想按div中的不同子节点(作者、标题、日期)订购$divArray

div看起来像这样

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

那么我如何获取$divArray并按
对其排序呢

谢谢你的帮助。 jw

基本程序是

  • simplexmlement
    强制转换为数组
  • 编写一个接受两个
    simplexmlement
    参数的比较函数
  • 使用
    usort()
  • 我只能猜测您最初的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);
    
    步骤2:编写一个比较函数。由于数组是
    simplexmlement
    s的列表,因此比较函数必须接受
    simplexmlement
    参数
    simplexmlement
    s需要显式强制转换来获取字符串或整数值

    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;
    }
    
    基本程序是

  • simplexmlement
    强制转换为数组
  • 编写一个接受两个
    simplexmlement
    参数的比较函数
  • 使用
    usort()
  • 我只能猜测您最初的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);
    
    步骤2:编写一个比较函数。由于数组是
    simplexmlement
    s的列表,因此比较函数必须接受
    simplexmlement
    参数
    simplexmlement
    s需要显式强制转换来获取字符串或整数值

    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;
    }
    

    使用
    usort
    可能重复的用法
    usort
    可能重复的用法非常感谢。你的回答很详细,很有帮助。同样,您对SimpleXML对象与数组的说明对于像我这样的业余爱好者非常有用。:)它工作得很好。如果您有时间,您是否可以尝试简要解释cmp功能的工作原理。我一直在读手册,但它似乎真的让我困惑。如果没有时间,没问题。用于排序的自定义比较函数是许多语言的一个非常常见的功能。有关说明和示例,请参见。基本思想是使用一个函数,该函数接受要排序的两个对象并返回-1、0或1,具体取决于第一个对象是小于、等于还是大于第二个对象。usort(或其他)将在需要比较两件事时调用您提供的函数。非常感谢——这是一个非常有用的解释。非常感谢。你的回答很详细,很有帮助。同样,您对SimpleXML对象与数组的说明对于像我这样的业余爱好者非常有用。:)它工作得很好。如果您有时间,您是否可以尝试简要解释cmp功能的工作原理。我一直在读手册,但它似乎真的让我困惑。如果没有时间,没问题。用于排序的自定义比较函数是许多语言的一个非常常见的功能。有关说明和示例,请参见。基本思想是使用一个函数,该函数接受要排序的两个对象并返回-1、0或1,具体取决于第一个对象是小于、等于还是大于第二个对象。usort(或其他)将在需要比较两件事时调用您提供的函数。非常感谢——这是一个非常有用的解释。