使用PHP将多个XML源解析为一个排序数组

3

我想创建一个可排序的列表,类似于:

  • $VAR1[0],$VAR2[0]...
  • $VAR1[1],$VAR2[1]...

数据来自多个相同结构的 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进行排序并显示结果。

4个回答

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

另外,我非常确定你不能以那种方式分配 $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>';

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所说的那样。


我不知道为什么它没有正确显示。预览显示得很好。 - Jaka Jančar

0
如果我是你,我会把所有的SimpleXMLElements推到数组上,然后使用带有自定义回调函数的uasort()函数按照你所需的方式进行排序。这样行得通吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接