我想创建一个类似于
的可排序列表数据来自多个相同的结构化xml文件:
$xmlfile="
<Level1>
<Level2>
<Level2Item VAR1="1" VAR2="2" ... />
<Level2Item VAR1="4" VAR2="5" ... />
<Level2Item VAR1="7" VAR2="8" ... />
</Level2>
</Level1>";
//Extract each item
$xml = new SimpleXMLElement($xmlfile);
foreach ($xml->Level2[0] as $result) {
array_push($VAR1Array, $result['VAR1']);
array_push($VAR2Array, $result['VAR2']);
//... etc etc
}
//sort
//$sortedArray = sort($VAR1Array);
输出
Array(
[0] => SimpleXMLElement Object([0] => 1)
[1] => SimpleXMLElement Object([0] => 4)
[2] => SimpleXMLElement Object([0] => 7)
)
从这个XML结构中,将数据存储在一个数组中的最佳方法是什么?我希望能够将所有数据收集到一个数组中,这样我就可以用一个或两个VAR对它进行排序并显示结果。
答案 0 :(得分:2)
我不太确定你要做什么样的排序(你应该用一些例子来说明)。但最佳的是,您不会将XML片段加载到数组中。
$xmlfile="
<Level1>
<Level2>
<Level2Item VAR1="1" VAR2="2" ... />
<Level2Item VAR1="4" VAR2="5" ... />
<Level2Item VAR1="7" VAR2="8" ... />
</Level2>
</Level1>";
//Extract each item
$xml = new SimpleXMLElement($xmlfile);
foreach ($xml->Level2[0] as $result) {
$VAR1Array[] = (int) $result['VAR1'];
$VAR2Array[] = (int) $result['VAR2'];
//... etc etc
}
最后,sort()
以引用方式工作,因此不要将其等同于变量(即只说sort($array);
作为整行,然后$array
将被排序。如果你像我在上面的例子中那样转换为int
你可以使用php的默认排序函数,而不像其他人建议的那样使用用户定义的比较函数。而且array_push
有点慢和难读使用php的$var[]
语法将新元素添加到数组中。
答案 1 :(得分:1)
另外,我完全相信你不能以这种方式分配$ xmlfile(在双引号内使用未转义的双引号。
在此代码中,定义$ xmlfile的最佳方法是:
$xmlfile = <<<XML
<Level1>
<Level2>
<Level2Item VAR1="1" VAR2="2" ... />
<Level2Item VAR1="4" VAR2="5" ... />
<Level2Item VAR1="7" VAR2="8" ... />
</Level2>
</Level1>
XML;
或
$xmlfile = '
<Level1>
<Level2>
<Level2Item VAR1="1" VAR2="2" ... />
<Level2Item VAR1="4" VAR2="5" ... />
<Level2Item VAR1="7" VAR2="8" ... />
</Level2>
</Level1>';
答案 2 :(得分:0)
如果我是你,我只需将所有SimpleXMLElements推送到一个数组上,然后使用带有自定义回调函数的uasort()进行排序。这有用吗?
答案 3 :(得分:0)
$xml = simplexml_load_file(...);
$table = array();
foreach ($xml->Level2[0] as $result)
$table[] = $result->attributes();
function cmp_row($a, $b, $sortColumn)
{
if ($a == $b)
return 0;
return ($a < $b) ? -1 : 1;
}
$sortColumn = 'VAR1'; // make sure it's a clean string
uasort($table, create_function('$a,$b', 'return cmp_row($a, $b, "'.$sortColumn.'")'));
如果你愿意的话,你也可以保留SimpleXMLElements并直接对它们进行排序,就像apinstein所说的那样。