2011-11-25 68 views
0

所以我有一個在xml文件中的<div>的列表。通過不同的childNodes(作者,標題按子節點排序xml div PHP SimpleXML

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

但現在我想訂購$ divArray:我解析使用PHP的SimpleXML

文件

我可以生成所有的div用下面的數組,日期)在div內。

div看起來像這樣。

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

所以,我怎麼能採取$ divArray和<author><title><date>排序呢?

感謝您的幫助。 JW

+0

使用陣列'usort' http://stackoverflow.com/questions/8076506/using-usort-with-simplexml – prodigitalson

+0

[PHP的可能重複排序問題與simpleXML](http://stackoverflow.com/questions/3023029/php-sorting-issue-with-simplexml) – hakre

回答

5

的基本程序是

  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 s的列表,所以比較函數必須接受SimpleXMLElement參數。 SimpleXMLElement 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; 
} 

步驟3:排序與usort()

usort($divArray, 'author_cmp'); 
print_r($divArray); 
+0

非常感謝。您的回覆非常詳細且有幫助。同樣,關於SimpleXML對象與Array的說明對於像我這樣的業餘愛好者非常有幫助。 :)它效果很好。如果你有時間,你認爲你可以嘗試簡要解釋cmp函數是如何工作的。我一直在閱讀手冊,但它似乎讓我感到困惑。如果你沒有時間,沒問題。 – Jeff

+2

排序的自定義比較函數是許多語言的一個相當常見的功能。有關描述和示例,請參見[usort()頁面](http://php.net/manual/en/function.usort.php)。基本思想是有一個函數,它接受兩個你正在排序的東西,並根據第一個東西是小於,等於還是大於第二個東西,返回-1,0或1。然後usort(或其他)會調用你提供的這個函數,只要它需要比較兩件事情。 –

+0

非常感謝 - 這是一個非常有用的解釋。 – Jeff