0

主要思想:使用简单 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 的新手,因此您可以提供的任何示例或解释都会非常有帮助。

4

1 回答 1

0

编辑:分组,先排序,然后输出。
致谢: [GZipp][1] 在这篇文章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 />";

}

看到它工作:http ://codepad.viper-7.com/Lke7gc

于 2013-06-05T16:27:25.110 回答