0

カテゴリとサブカテゴリ+画像を含む既存のXMLファイルから順序付けされていないリストを作成しようとしています。各サブカテゴリは、ネストされたリスト内の関連する各画像とともに、順序付けされていないリスト内のアイテムである必要があります。サブカテゴリは1回だけ表示する必要があります(同じ場合は繰り返さないでください)。私が探しているのは再帰的なループだと思いますが、それは私が迷子になるところです。

基本的に、私はこれに似た外観を実現しようとしています。

-------------- DOGS -------------
[..........small.........。 ]
[画像][画像]
[..........大きい..........]
[画像]
--------------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);

    ?>
4

1 に答える 1

2

あなたがそれをすることができる方法は文字通り千の方法があります。最も簡単なのはおそらくxpath()。これは、学ぶ価値のある強力なXMLクエリ言語です。$xmlsimplexmlelementの例:

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]);

その例をデモとしてオンラインで公開しました。

私はインデント付きのテキストと同じように出力しますが、sのおかげで、foreachそれをHTMLに変換するのは本当に簡単なはずです。私はそれを演習として残します。

于 2012-11-02T00:00:24.593 に答える