2013-10-31 60 views
0

我正在解析一个外部xml文件来显示总线如何去。Php simplexml组数据

$xmlurl = 'https://api.trafiklab.se/sl/realtid/GetDpsDepartures.xml?siteId=9520&key=XXX'; 
$xml = simplexml_load_file($xmlurl); 

的结果是这样的:

<buses> 

<DpsBus> 
<Line>Blue</Line> 
<Destination>North</Destination> 
<Time>5 min</Time> 
<DpsBus> 

<DpsBus> 
<Line>Green</Line> 
<Destination>East</Destination> 
<Time>7 min</Time> 
<DpsBus> 

<DpsBus> 
<Line>Blue</Line> 
<Destination>North</Destination> 
<Time>9 min</Time> 
<DpsBus> 

... 

</buses> 

现在我展示的结果是这样的:

$i = 0; 
while ($i<100) { 
echo $xml->Buses->DpsBus[$i]->Line; 
echo $xml->Buses->DpsBus[$i]->Destination; 
echo $xml->Buses->DpsBus[$i]->Time; 
$i++; 
} 

但我可以采用某种组此表中的数据?

所以结果如下:

Blue North | 7分钟| 10分钟| 25分钟

Blue South | 5分钟| 15分钟| 25分钟

Green South | 10分钟| 15分钟| 20分钟

任何想法?

+0

'但是我可以采用某种排序此表中的' - 分类标准是什么? –

+0

你可能是指* group *? – hakre

+0

是的,我是meen团体。我现在编辑了我的问题。 – Stichy

回答

0

附注:您的XML需要修复,您需要关闭</DpsBus>

这里是我的镜头吧:

$xml = simplexml_load_string($x); // assume XML in $x 

// get a unique list of lines and destinations... 
foreach ($xml->DpsBus as $bus) $lines[(string)$bus->Line.'|'.(string)$bus->Destination]=''; 
$lines = array_keys($lines); 

// get the times 
foreach ($lines as $l) { 

    list($line,$dest)=explode('|',$l); 
    $times = $xml->xpath("//DpsBus[Line='$line' and Destination='$dest']/Time"); 
    echo "$line $dest: "; 
    foreach ($times as $time) echo "$time | "; 
    echo "<br />"; 
} 

输出:

Blue North: 5 min | 9 min | 
Green East: 7 min | 

看到它的工作:http://codepad.viper-7.com/oy7Jxc

说明

  1. 创建的公共汽车线路和目的地代码线4)唯一列表:循环通过整个XML,得到每行和每一个目的地,并用作为line|destination密钥创建关联数组$lines。关联数组中的键是唯一的。在中使用array_keys()代码行5返回具有所有可能的唯一line|destination组合作为值的数组,例如, Blue|North。现在
  2. 遍历$lines和独立line|destination$line$destinationexplode()代码行10
  3. 选择<DpsBus>节点的所有<Time> -nodes与该特定<line><destination>使用xpath代码第11行)。
  4. 输出它