【问题标题】:Parsing multiple XML feeds with PHP into one sorted array使用 PHP 将多个 XML 提要解析为一个排序数组
【发布时间】:2010-10-18 11:16:16
【问题描述】:

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

  • $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 结构中,将数据存储在一个数组中的最佳方式是什么?我希望能够将所有数据收集到一个数组中,这样我就可以按 1 或 2 个 VAR 对其进行排序并显示结果。

【问题讨论】:

    标签: php xml arrays


    【解决方案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) {
     $VAR1Array[] = (int) $result['VAR1'];
     $VAR2Array[] = (int) $result['VAR2'];
     //... etc etc
    }
    

    最后,sort() 通过引用起作用,因此不要将其等同于变量(即,只需将 sort($array); 表示为整行,然后将 $array 排序。如果您转换为 ints就像我在上面的示例中所做的那样,您可以使用 php 的默认排序函数,而无需像其他人建议的那样使用用户定义的比较函数。而且 array_push 比使用 php 的 $var[] 语法添加新的语法要慢一些且难以阅读元素到数组。

    【讨论】:

      【解决方案2】:

      另外,我完全确定您不能以这种方式分配 $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>';
      

      【讨论】:

        【解决方案3】:

        如果我是你,我会将所有 SimpleXMLElements 推送到一个数组中,然后使用带有自定义回调函数的 uasort() 来根据需要进行排序。这行得通吗?

        【讨论】:

          【解决方案4】:
          $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 所说的那样。

          【讨论】:

          • 我不知道为什么显示不正确。预览显示它很好。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-25
          • 2017-04-21
          • 2011-05-15
          • 1970-01-01
          相关资源
          最近更新 更多