sort xml div by child node PHP SimpleXML

后端 未结 1 1006
一生所求
一生所求 2020-12-20 09:52

so I have a list of

\'s in an xml file. I\'m parsing the file using php\'s simpleXML

I can generate an array of all the divs with the followi

相关标签:
1条回答
  • 2020-12-20 10:32

    The basic procedure is

    1. cast a SimpleXMLElement into an array
    2. write a comparison function that accepts two SimpleXMLElement arguments
    3. sort the array with the comparison function using usort()

    I can only guess at your original XML structure, but I think it looks something like this:

    $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);
    

    Step 1: Cast to array. Note that your $divArray is not actually an array!

    $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);
    

    Step 2: write a comparison function. Since the array is a list of SimpleXMLElements, the comparison function must accept SimpleXMLElement arguments. SimpleXMLElements need explicit casting to get string or integer values.

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

    Step 3: Sort the array with usort()

    usort($divArray, 'author_cmp');
    print_r($divArray);
    
    0 讨论(0)
提交回复
热议问题