У меня есть xml-файл, загруженный simplexml, и мне нужно сортировать поля по цене или по автору или названию. Как я могу это сделать? Это нормально, используя 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;
Сортируйте свой симплекс следующим образом:
функция sort_obj_arr
написанная GZipp в этом сообщении
$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); }
Live demo @ http://codepad.viper-7.com/QvLqIq
Я знаю, что сначала это звучит глупо: но сопоставьте данные в массиве и используйте специальный обратный вызов массива для usort
если вы хотите сделать это правильно, вы разработаете что-то, что называется paginator, которое заботится о ограничении результата, отображаемого на страницу и позволяет использовать пользовательские фильтры.