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

使用PHP将多个XML提要解析为一个排序数组,php,xml,arrays,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" ... />

我想创建一个可排序的列表,看起来像

  • $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);

从这个XML结构来看,在一个数组中存储数据的最佳方式是什么?我希望能够在一个数组中收集所有数据,以便可以按一个或两个变量对其进行排序并显示结果。

如果我是您,我只需将所有SimpleXmlElement推送到一个数组中,然后使用uasort()和自定义回调函数按照您的意愿进行排序。这行吗?

$xml=simplexml\u load\u文件(…);
$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.'")'));
$table=array(); foreach($xml->Level2[0]作为$result) $table[]=$result->attributes(); 函数cmp_行($a、$b、$sortColumn) { 如果($a=$b) 返回0; 回报率($a<$b)?-1:1; } $sortColumn='VAR1';//确保它是一根干净的绳子 uasort($table,create_函数($a,$b','return cmp_行($a,$b,'.$sortColumn'));
您还可以保留SimpleXMLElements并直接对它们进行排序,如果您愿意的话,就像apinstein所说的那样。

我不太确定您要进行什么样的排序(您应该用一些示例来指定)。但最佳情况是,您不会将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
}
$xmlfile=”
";
//提取每个项目
$xml=新的simplexmlement($xmlfile);
foreach($xml->Level2[0]作为$result){
$VAR1Array[]=(int)$result['VAR1'];
$VAR2Array[]=(int)$result['VAR2'];
//…等等
}

最后,
sort();
作为整行,然后
$array
将被排序。如果您像我在上面的示例中那样转换为
int
s,您可以使用php的默认排序函数,而无需像其他人建议的那样使用用户定义的比较函数。
array\u push
比使用php的
$var[]稍微慢一点,更难阅读
语法将新元素添加到数组。

此外,我完全确定您不能以这种方式分配$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=我不知道为什么显示不正确。预览显示得很好。
$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>';