簡體   English   中英

按子節點PHP SimpleXML排序xml div

[英]sort xml div by child node PHP SimpleXML

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

我可以使用以下命令生成所有div的數組:

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

但是現在我想通過div中的不同childNode(作者,標題,日期)對$ divArray進行排序。

div看起來像這樣。

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

那么,如何獲取$ divArray並按<author><title><date>對其進行排序?

謝謝你的幫助。 JW

基本程序是

  1. SimpleXMLElement轉換為數組
  2. 寫一個比較函數,接受兩個SimpleXMLElement參數
  3. 使用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);

步驟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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM