Php 在细枝中循环浏览类别、子类别和产品

Php 在细枝中循环浏览类别、子类别和产品,php,symfony,view,twig,Php,Symfony,View,Twig,我的数据库中的表结构如下所示: 有些类别有子类别,有些则没有。产品可以属于: 子类别 父类别(此类别没有子类别) 我的数组如下所示: 类别A是父类别B类-头部也是父类类别B-儿童是B-头部的儿童类别 现在我想这样展示这个数组: 但我被困在如何知道它是一个类别还是一个产品列表上。有人能帮我吗?如果您使用的是条令模型(如果您使用的是Symfony,您应该是这样),那么您所做的就是在对象上的方法之间循环 简单快速的示例,假设很少,例如使用@Template()注释和标准DAOs(也称为Ent

我的数据库中的表结构如下所示:

有些类别有子类别,有些则没有。产品可以属于:

  • 子类别
  • 父类别(此类别没有子类别)
我的数组如下所示:

类别A是父类别B类-头部也是父类类别B-儿童B-头部的儿童类别

现在我想这样展示这个数组:


但我被困在如何知道它是一个类别还是一个产品列表上。有人能帮我吗?

如果您使用的是条令模型(如果您使用的是Symfony,您应该是这样),那么您所做的就是在对象上的方法之间循环

简单快速的示例,假设很少,例如使用@Template()注释和标准DAOs(也称为EntityManager),以及在Category.php(也称为model/entity)上使用getChildren()和getProducts()方法

在控制器上

/**
 * @Route("/products", name="all_products")
 * @Template()
 */
public function someAction()
{
    ...
    $categories      = $this->getCategoryManager()->findBy([]);
    ...
    return [
        'categories' => $categories
    ];
}
在你的小枝模板中

{% if categories|length > 0 %}
    {% for category in categories %}
        {% if category.children|length > 0 %}
        ... Here you create the HTML for nested ...
        {% else %}
            ... Here you create the HTML for Category ...
            {% for product in category.products %}
            ... Here you create the HTML for products ...
            {% endfor %}
        {% endif %}
    {% endfor %}
{% else %}
    .... some html to handle empty categories ....
{% endif %}
如果在HTML for flat中重复了嵌套的HTML(很可能是这种情况),那么您可以创建并包含一个宏来为您输出

这是基本的,但我想它基本上涵盖了你的问题,如果我正确理解你的问题

顺便说一句,你绝对应该阅读twig和Symfony的文档,因为它们到处都有这样的例子


如果您做出适当回应,我将编辑此答案。目前您还没有发布足够的信息来正确指导您,但希望这能有所帮助。

您可以使用递归宏。在宏中,您可以打印产品列表或打印类别列表,然后调用自己。。等等

{% macro navigation(categories, products) %}
    {% from '_macros.html.twig' import navigation %}

    {% if categories|length > 0 or products|length > 0 %}
        <ul>
            {% for category in categories %}
                <li>
                    {{ category.name }}
                        ({{ category.children|length }} child(ren) &amp; {{ category.products|length }} products)
                    {{ navigation(category.children, category.products) }}
                </li>
            {% endfor %}
            {% for product in products %}
                <li>{{ product.name }}</li>
            {% endfor %}
        </ul>
    {% endif %}
{% endmacro %}
这只是创建了一组基本的嵌套无序列表,但显然可以用于任何您想要的HTML

看一看)

小提琴呈现如下(TwigWiddle仅显示HTLM,而不是可用于可视化的内容)


数据结构看起来并不适合您正在尝试的操作。父类别可以拥有的子类别是否有最大数量?例如,B类下是否还有其他类别?或者一件物品只能分为两类?@Shane,在B类-头下可能还有另一个儿童类。你建议什么结构。。一个类别可以同时包含子类别和产品,还是只能包含其中之一?@qoopmao,一个类别可以包含子类别(这些类别可以包含产品)或产品。不是两者都有。@nielsv老实说,我对Symfony不太了解,但它可以是一个实际的实体,而不仅仅是一个数组键(取决于它在后端的设置方式)。然后,我认为检查您当前循环的内容是否是/有子类别会更容易一些。
{% from '_macros.html.twig' import navigation %}

{{ navigation(array_of_categories) }}