2013-03-24 41 views
0

我有一個xml文件加載了simplexml,我需要按照價格或作者或標題對字段進行排序。我怎麼辦?它可以使用xpath或其他方式嗎?我看到了一個類似的例子在這裏,但我也不是很清楚使用簡單的XML和xpath對錶格字段進行排序

XML

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <libro> 
     <autor><![CDATA[Cervantes]]></autor> 
     <titulo><![CDATA[El Quijote]]></titulo> 
     <precio>30€</precio> 
    </libro> 
    <libro> 
     <autor><![CDATA[Calderón de la Barca]]></autor> 
     <titulo><![CDATA[La vida es sueño]]></titulo> 
     <precio>25€</precio> 
    </libro> 
    <libro> 
     <autor><![CDATA[Garcilaso de la vega]]></autor> 
     <titulo><![CDATA[Egoglas]]></titulo> 
     <precio>15€</precio> 
    </libro> 
    <libro> 
     <autor><![CDATA[Raymond Carver]]></autor> 
     <titulo><![CDATA[Catedral]]></titulo> 
     <precio>16€</precio> 
    </libro> 
    <libro> 
     <autor><![CDATA[George Orwell]]></autor> 
     <titulo><![CDATA[1984]]></titulo> 
     <precio>10€</precio> 
    </libro> 
    <libro> 
     <autor><![CDATA[Fidor Dostoyevski]]></autor> 
     <titulo><![CDATA[Crimen y Castigo]]></titulo> 
     <precio>35€</precio> 
    </libro> 
    <libro> 
     <autor><![CDATA[Juan Ponce]]></autor> 
     <titulo><![CDATA[Cronica de la intervencion]]></titulo> 
     <precio>25€</precio> 
    </libro> 
    <libro> 
     <autor><![CDATA[Yukio Mishima]]></autor> 
     <titulo><![CDATA[Confesiones de una mascara]]></titulo> 
     <precio>22€</precio> 
    </libro> 
    <libro> 
     <autor><![CDATA[Elfriede Jelinek]]></autor> 
     <titulo><![CDATA[Deseo]]></titulo> 
     <precio>20€</precio> 
    </libro> 
    <libro> 
     <autor><![CDATA[Bram Stoker]]></autor> 
     <titulo><![CDATA[Dracula]]></titulo> 
     <precio>18€</precio> 
    </libro> 
</root> 

PHP

$xml = simplexml_load_file('xml/libros.xml'); 
$sum = 0; 
$h = "<table>"; 
$h .= "<tr>"; 
$h .= "<td><a href='#' id='ordAut'><img src='img/up_down.png' /></a></td><td><a href='#' id='ordTit'><img src='img/up_down.png' /></a></td><td><a href='#' id='ordPre'><img src='img/up_down.png' /></a></td>"; 
$h .= "</tr>"; 
foreach ($xml->libro as $book) { 
    $h .= "<tr>"; 
    $h .= "<td>".$book->autor."</td><td>".$book->titulo."</td><td>".$book->precio."</td>"; 
    $h .= "</tr>"; 
    $sum += $book->precio; 
} 

$h .= "<tr><td colspan=\"2\">sum:</td><td>$sum</td></tr></table>"; 
echo $h; 
+0

看到這個http://stackoverflow.com/questions/3998722/how -to-sort-a-multi-dimensional-xml-file - 接受的答案應該做的伎倆! – michi 2013-03-24 22:09:54

+0

@michi,我會嘗試這個 – jal 2013-03-24 22:18:39

+0

好,只需要更新你的問題,如果你需要幫助。 – michi 2013-03-24 22:23:14

回答

0

排序您simplexml的是這樣的:

功能sort_obj_arr通過GZippthis post

$xml = simplexml_load_string($xmlstr, 'SimpleXMLElement', LIBXML_NOCDATA); 

$books = $xml->xpath("//libro"); 

echo "<pre>"; 
print_r($books); 
echo "</pre>"; 

$field = 'precio'; 
sort_obj_arr($books,$field,SORT_DESC); 

echo "<pre>"; 
print_r($books); 
echo "</pre>"; 


function sort_obj_arr(& $arr, $sort_field, $sort_direction) 
{ 
    $sort_func = function($obj_1, $obj_2) use ($sort_field, $sort_direction) 
    { 
     if ($sort_direction == SORT_ASC) { 
      return strnatcasecmp($obj_1->$sort_field, $obj_2->$sort_field); 
     } else { 
      return strnatcasecmp($obj_2->$sort_field, $obj_1->$sort_field); 
     } 
    }; 
    usort($arr, $sort_func); 
} 

現場演示書面@http://codepad.viper-7.com/QvLqIq

0

我知道它在第一音啞:但在一個陣列和使用數據映射一個自定義的數組回調usort 如果你想這樣做對的權利你會開發一種稱爲paginator,它負責限制在頁面上顯示的結果,並讓我們e自定義過濾器。

+0

我使用了usort,但是我遇到了問題 – jal 2013-03-24 22:19:29