2010-07-11 102 views
1

我有一个XML文件:混淆关于SimpleXML的

<kemo> 
<cities> 
    <area>area1</area > 
    <city>city1</city> 
    <status>Lipsum1</status> 
    </cities> 
<cities> 
    <area>area1</area > 
    <city>city2</city> 
    <status>Lipsum2</status> 
</cities> 
<cities> 
    <area >area2</area > 
    <city>city3</city> 
    <status>Lipsum3</status> 
</cities> 
<cities> 
    <area >area2</area > 
    <city>city4</city> 
    <status>Lipsum4</status> 
    </cities> 
<cities> 
    <area >area2</area > 
    <city>city5</city> 
    <status>Lipsum5</status> 
</cities> 
</kemo> 

我可以走线槽这个XML与simlpeXML,但我不想重复区域名称。我想一棵树是这样的:

area1 city1 
     city2 

area2 city3 
     city4 
     city5 

$request_url = "xml.xml"; 
$xml = simplexml_load_file($request_url) or die("feed not loading"); 
foreach($xml->kemo as $value){ 
    echo '<li><span>'.$value->area.' '.$value->city.'</span></li>'; 
} 

我已经重复区域。我怎样才能防止重复的孩子?

回答

5

这不是关于SimpleXML。我的建议是 - 将整个XML加载到数组中,然后列出它。如果您先将XML加载到数组中,则可以确保XML的列表不会像area1,area2,area1那样以错误的区域顺序被破坏。

$xml = simplexml_load_file('xml.xml') or die("feed not loading"); 
$data = array(); 
foreach($xml as $value) { 
    $area = (string)$value->area; 
    // $area needs to be a string when using as a array key 
    $data[$area][] = $value->city; 
} 

然后用$data

foreach ($data as $area_name => $cities) { 
    print $area_name; 
    foreach ($cities as $city) { 
     print $city; 
    } 
} 
+0

这是一个非常优雅的解决方案:-) – Burbas 2010-07-11 18:33:45

+0

警告:非法偏移类型 – TheNone 2010-07-11 18:46:16

+0

@dwich:+1我可能完全没有得到他的问题。 – Sarfraz 2010-07-11 18:50:16

0

的工作,你可以做这样的手工检查:

$xml = simplexml_load_file($request_url) or die("feed not loading"); 
foreach($xml->kemo as $value){ 
    ($value->area == $prev_area) ? $area = "" : $area = $value_area && $prev_area = $area); 
    echo '<li><span>'.$area.' '.$value->city.'</span></li>'; 
} 

不知道这是否会编译,但你可能会得到的想法: )