Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用SimpleXML基于属性对XML数据进行分组_Php_Xml_Simplexml_Grouping - Fatal编程技术网

Php 使用SimpleXML基于属性对XML数据进行分组

Php 使用SimpleXML基于属性对XML数据进行分组,php,xml,simplexml,grouping,Php,Xml,Simplexml,Grouping,主要思想:使用简单的XML,我希望能够根据其中一个属性对数据进行分组 我的数据设置示例(简化): 以上面的例子为例,我目前正在使用SimpleXML搜索一个等级(即第8级),然后在下面列出每个条目的名称,这给了我类似的信息: **8th Grade** Jon Doe Jane Smith 等等。唯一的问题是我正在为我想要显示的每个等级创建一个“foreach”语句 我相信一定有一种方法,只要有一个语句,它就可以将每个人的名字按年级分组,而不必每次我想添加一个新的年级并手动键入“foreach

主要思想:使用简单的XML,我希望能够根据其中一个属性对数据进行分组

我的数据设置示例(简化):

以上面的例子为例,我目前正在使用SimpleXML搜索一个等级(即第8级),然后在下面列出每个条目的名称,这给了我类似的信息:

**8th Grade**
Jon Doe
Jane Smith
等等。唯一的问题是我正在为我想要显示的每个等级创建一个“foreach”语句

我相信一定有一种方法,只要有一个语句,它就可以将每个人的名字按年级分组,而不必每次我想添加一个新的年级并手动键入“foreach”语句时都要输入


我对PHP完全是新手,所以您能给出的任何示例或解释都会非常有用。

编辑:对组进行排序,然后输出。
学分:函数
sort_obj_arr
由[gzip][1]在中编写


看到它工作了吗:

很抱歉,无效的xml,我只是把它作为一个例子,它不是我的实际代码。好的,这就是我已经在做的,我想要的是下一步,不是用“8级”标识所有记录,而是让xml用它们对应的记录吐出每个等级。因此,如果我有24个条目(每个年级2个),我会得到所有12个年级,这些学生低于他们各自的年级。希望不会混淆。数据是按组字段排序的吗?
**8th Grade**
Jon Doe
Jane Smith
// 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);
}
<Entries>
    <Entry>
        <Entry_Id>1</Entry_Id>
        <Field_1>John</Field_1>
        <Field_2>Doe</Field_2>
        <Field_3>8</Field_3>
    </Entry>
</Entries>
$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 />";

}