【问题标题】:Create nested list with PHP from XML dataset使用 PHP 从 XML 数据集创建嵌套列表
【发布时间】:2012-11-01 21:08:35
【问题描述】:

我正在尝试从包含类别和子类别 + 图像的现有 XML 文件构建一个无序列表。我需要每个子类别成为无序列表中的一个项目,每个相关图像都在嵌套列表中。子类别应仅显示一次(如果相同,则不得重复)。我相信我正在寻找的是一个递归循环,但这就是我迷路的地方。

基本上,我正在尝试实现类似于此的外观:

-------------狗-------------
[.............小............]
[图片] [图片]
[…………大…………]
[图片]
--------------猫-------------
[.............中等............]
[图片]
[…………大…………]
[图片] [图片]


我的 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);

    ?>

【问题讨论】:

  • EASY:获取json格式的数据,不用担心使用XML

标签: php xml arrays xpath simplexml


【解决方案1】:

实际上有上千种方法可以做到这一点。最直接的可能是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 放到网上。

我的输出只是带有缩进的文本,但是感谢foreachs,将其转换为 HTML 应该非常简单。我把它留作练习。

【讨论】:

  • 您介意在我的原始帖子中查看更新后的 XML 吗?谢谢
  • 好吧,您已经将许多动物移入- 类别。您可能希望以一种将动物放入子类别并将子类别放入类别的格式来构建您的 XML。这样你就不用再用 xpath 查询数据了。
  • 完美!现在明白了!非常非常感谢。
猜你喜欢
  • 2022-08-03
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多