2010-07-11 105 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>'; 
} 

不知道這是否會編譯,但你可能會得到的想法: )