使用PHP将多个XML提要解析为一个已排序的数组

时间:2009-04-09 02:34:48

标签: php xml arrays

我想创建一个类似于

的可排序列表
  • $ 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 个答案:

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