2012-11-01 59 views
0

我試圖從包含類別和子類別+圖像的現有XML文件構建無序列表。我需要每個子類別都是無序列表中的項目,每個相關圖像都嵌套在列表中。子類別只應顯示一次(如果相同,則不得重複)。我相信我正在尋找的是一個遞歸循環,但那就是我迷失的地方。從XML數據集中使用PHP創建嵌套列表

從本質上講,我想實現一個類似的外觀:

-------------- DOGS -------------
[..........小..........]
[圖片] [圖片]
[..........大... .......]
[圖片]
-------------- CATS -------------
[.... ......中..........]
[圖片]
[..........大..........]
[圖片] [圖片]


我的XML文件的結構:

<root> 
    <animal> 
     <category>DOGS</category> 
     <subcategory>small</subcategory> 
     <name>Terrier</name> 
     <image>aaa.jpg</image> 
    </animal> 
    <animal> 
     <category>-</category> 
     <subcategory>small</subcategory> 
     <name>Havanese</name> 
     <image>bbb.jpg</image> 
    </animal> 
    <animal> 
     <category>-</category> 
     <subcategory>large</subcategory> 
     <name>Dalmatian</name> 
     <image>ccc.jpg</image> 
    </animal> 
    <animal> 
     <category>CATS</category> 
     <subcategory>medium</subcategory> 
     <name>Abyssinian</name> 
     <image>ddd.jpg</image> 
    </animal> 
    <animal> 
     <category>-</category> 
     <subcategory>large</subcategory> 
     <name>Birman</name> 
     <image>eee.jpg</image> 
    </animal> 
    <animal> 
     <category>-</category> 
     <subcategory>large</subcategory> 
     <name>American Shorthair</name> 
     <image>fff.jpg</image> 
    </animal> 
</root> 



這是我迄今爲止嘗試:

<?php 

    $xml = simplexml_load_file("file.xml"); 

    $categories  = array(); 
    $subcategories = array(); 
    $names  = array(); 
    $image   = array(); 

    foreach($xml->animal as $animals) { 
     $category  = $animals->category; 
     $subcategory  = $animals->subcategory; 
     $name   = $animals->name; 
     $image  = $animals->image; 

     $categories[]  = $category; 
     $subcategories[] = $subcategory; 
     $names[]   = $name; 
     $images[]  = $image 
    } 

    function getMenu($xml, $categories, $subcategories, $names, $images) { 
     $output = '<ul>'; 
      foreach(array_keys($images) as $n) {  
       $output .= '<li class="animals" data-tags="'.$names[$n].'">'; 
       $output .= '<img src="xml/'.$images[$n].'" width="75" height="75" alt="'.$names[$n].'" />'; 
       $output .= '</li>';  
      } 

     $output.= '</ul>'; 
     return array($output); 
    } 

    $result = getMenu($xml, $categories, $subcategories, $names, $images); 

    echo json_encode($result); 

    ?> 
+0

EASY:以json格式獲取數據,然後不用擔心使用XML –

回答

2

從字面上有一千種方式你如何做到這一點。最直截了當的可能是xpath()。這是一種功能強大的XML查詢語言,值得學習。例如你$xml的SimpleXMLElement:

foreach ($xml->xpath('//category[not(. = following::category)]') as $category) { 
    echo "=== $category === \n"; 
    foreach ($xml->xpath("//animal[category = '$category']/subcategory[not(. = following::animal[category = '$category']/subcategory)]") as $subcategory) { 
     echo " = $subcategory =\n"; 
     foreach ($xml->xpath("//animal[category = '$category' and subcategory = '$subcategory']") as $animal) { 
      echo " * $animal->name ($animal->image)\n"; 
     } 
    } 
} 

輸出:

=== DOGS === 
    = small = 
    * Terrier (aaa.jpg) 
    * Havanese (bbb.jpg) 
    = large = 
    * Dalmatian (ccc.jpg) 

您進一步上可能要更換冗長的XPath字符串在那裏。隨着封閉的幫助和迭代器合計,它甚至有可能減少代碼很舒服:

foreach ($categories as $category) { 
    echo "=== $category === \n"; 
    foreach ($subcategories as $subcategory) { 
     echo " = $subcategory =\n"; 
     foreach ($animals as $animal) { 
      echo " * $animal->name ($animal->image)\n"; 
     } 
    } 
} 

這將允許稍後改變XML結構,並具有XPath的中央位置配置:

$categories = $vpath('//category[not(. = following::category)]'); 
$subcategories = $vpath('//animal[category = "%1$s"]/subcategory[not(. = following::animal[category = "%1$s"]/subcategory)]', [&$category]); 
$animals  = $vpath("//animal[category = '%s' and subcategory = '%s']", [&$category, &$subcategory]); 

我已經把這個例子在線作爲demo

我的輸出就像帶縮進的文本一樣,但是要感謝foreach s,應該非常直接地將它轉換爲HTML。我把它作爲一個練習。

+0

你介意在我的原始文章中查看更新的XML嗎?謝謝 – Gdsmk

+0

好吧,您已經將許多動物轉移到'-'類別中。您可能希望以一種將動物的子類別和子類別劃分爲多個類別的格式來構造您的XML。然後用xpath查詢數據時不會有那麼多麻煩。 – hakre

+0

完美!現在明白了!非常非常感謝你。 – Gdsmk