主要思想:使用简单XML我希望能够根据其中一个属性对数据进行分组。
我的数据设置示例(简化):
[Entry]
[Entry Id]1[/Entry Id]
[Field 1]First Name[/Field 1]
[Field 2]Last Name[/Field 2]
[Field 3]Grade[/Field 3]
[/Entry]
以上面的例子为例,我目前正在使用SimpleXML搜索一个等级(即第8个),然后在其下面列出每个条目的名称,给我一些类似的信息:
**8th Grade**
Jon Doe
Jane Smith
等等。唯一的问题是我正在为我要显示的每个等级创建一个“foreach”语句。
我认为必须有一种方法可以只有一个语句,根据年级分配出每个人的姓名,而不必每次都要添加新成绩并手动输入“foreach”语句。
我是PHP的全新内容,因此您可以提供的任何示例或解释都非常有用。
答案 0 :(得分:0)
编辑:到群组,首先对其进行排序,然后输出
致谢:[GZipp] [1]在this post中撰写的函数sort_obj_arr
。
// define it
$xml = simplexml_load_string($x); // assuming XML in $x
$grades = $xml->xpath("//Entry");
// sort it
sort_obj_arr($grades,'Field_3',SORT_ASC);
// print it
$g = "";
foreach ($grades as $grade) {
if ($grade->Field_3 <> $g) {
$g = (string)$grade->Field_3;
echo "<br />*** grade $g ***<br />";
}
echo $grade->Field_1 . " " . $grade->Field_2 . "<br />";
}
// function for sorting
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/Saka16
首先:您的XML无效,您需要<>
且节点名称中没有空格:
<Entries>
<Entry>
<Entry_Id>1</Entry_Id>
<Field_1>John</Field_1>
<Field_2>Doe</Field_2>
<Field_3>8</Field_3>
</Entry>
</Entries>
选择具有特定值的节点,使用xpath
:
$xml = simplexml_load_string($x); // assuming XML in $x
$grades = $xml->xpath("//Entry[Field_3 = '8']");
echo "** grade: " . $grades[0]->Field_3 . "**<br />";
foreach ($grades as $grade) {
echo $grade->Field_1 . " " . $grade->Field_2 . "<br />";
}