2011-11-25 69 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