Php 使用简单的XML和xpath对表字段进行排序
我有一个加载了simplexml的xml文件,我需要按价格、作者或标题对字段进行排序。我怎么办?可以使用xpath或其他方式进行操作吗?我在这里看到了一个类似的例子,但我不是很清楚 XMLPhp 使用简单的XML和xpath对表字段进行排序,php,xml,xpath,Php,Xml,Xpath,我有一个加载了simplexml的xml文件,我需要按价格、作者或标题对字段进行排序。我怎么办?可以使用xpath或其他方式进行操作吗?我在这里看到了一个类似的例子,但我不是很清楚 XML "; $h.=”; foreach($xml->libro作为$book){ $h.=”; $h.=“..$book->autor.”“$book->titulo.”“$book->precio.”; $h.=”; $sum+=$book->precio; } $h.=“总和:$sum”; echo$h;
";
$h.=”;
foreach($xml->libro作为$book){
$h.=”;
$h.=“..$book->autor.”“$book->titulo.”“$book->precio.”;
$h.=”;
$sum+=$book->precio;
}
$h.=“总和:$sum”;
echo$h;
我知道一开始听起来很愚蠢:但是映射数组中的数据,并使用自定义数组回调来调用usort
如果您想正确地执行此操作,您将开发一种称为paginator的工具,它负责限制页面上显示的结果,并允许您使用自定义筛选器。对simplexml进行如下排序: 函数
sort\u obj\u arr
由in编写
$xml=simplexml\u load\u字符串($xmlstr,'simplexmlement',LIBXML\u NOCDATA);
$books=$xml->xpath(“//libro”);
回声“;
印刷(书籍);
回声“;
$field='precio';
sort_obj_arr($books,$field,sort_DESC);
回声“;
印刷(书籍);
回声“;
函数sort_obj_arr(&$arr,$sort_字段,$sort_方向)
{
$sort\u func=函数($obj\u 1,$obj\u 2)使用($sort\u字段,$sort\u方向)
{
如果($sort\u direction==sort\u ASC){
返回strnatcasecmp($obj_1->$sort_字段,$obj_2->$sort_字段);
}否则{
返回strnatcasecmp($obj_2->$sort_字段,$obj_1->$sort_字段);
}
};
usort($arr,$sort_func);
}
Live demo@看这个-接受的答案应该会起作用!@michi,我会试试这个好的,如果你需要帮助,就更新你的问题。jal,我收到你的评论,说你更新了你的问题,但它链接到一个页面,上面写着:问题已被作者删除?@michi,很抱歉我犯了一个错误。我用usort写的,但我有专业版瑕疵
<?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>
$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;
$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);
}