簡體   English   中英

使用PHP將多個XML提要解析為一個已排序的數組

[英]Parsing multiple XML feeds with PHP into one sorted array

我想創建一個類似於的可排序列表

  • $ 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對其進行排序並顯示結果。

我不太確定你要做什么樣的排序(你應該用一些例子來說明)。 但最佳的是,您不會將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[]語法向數組中添加新元素要慢一些並且更難閱讀。

另外,我完全相信你不能以這種方式分配$ 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>';

如果我是你,我只需將所有的SimpleXMLElements推送到一個數組上,然后使用帶有自定義回調函數的uasort()來根據需要進行排序。 那樣有用嗎?

$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所說的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM