在树枝中搜索多维数组

时间:2014-09-04 09:01:38

标签: php html twig

我有一个模板,其中包含从一个数组创建的多个列表。

PHP:

$array = [
    ['type' => 'A', 'name' => 'string 1'],
    ['type' => 'B', 'name' => 'string 2'],
    ['type' => 'A', 'name' => 'string 3'],
    ['type' => 'B', 'name' => 'string 4']
];


HTML:

<h4>A</h4>
<ul>
    {% for value in array %}
        {% if value.type == 'A' %}
            {{ value.name }}
        {% endif %}
    {% endfor %}
</ul>
<h4>B</h4>
<ul>
    {% for value in array %}
        {% if value.type == 'B' %}
            {{ value.name }}
        {% endif %}
    {% endfor %}
</ul>

但是,当找不到类型时,我不想显示<h4><ul>。 我怎么能这样做?

3 个答案:

答案 0 :(得分:0)

此处仅在类型存在时打印类型。 Twig for loop condition

{% for item in array if item.type == 'A' %}
    {% if loop.first %}<h4>A</h4>{% endif %}
    {{ item.name }}
{% endfor %}

正如@RoToRa所建议的那样,它更容易在控制器中完成它并且更有意义,或者可能通过数据库处理的工作。它将取决于设计哪里有更好的数据要分开。还要记住,视图应该显示,将逻辑代码保存在控制器中。

希望这个帮助

答案 1 :(得分:0)

正确的解决方案:&#34;重构&#34;你的数组在控制器中,以便&#34;类型&#34;用作键,如下:

$arrayByType = [
    [ 'A' => [
        ['type' => 'A', 'name' => 'string 1'],
        ['type' => 'A', 'name' => 'string 3']
    ],
    [ 'B' => [
        ['type' => 'B', 'name' => 'string 2'],
        ['type' => 'B', 'name' => 'string 4']
    ],
];

这可以这样做:

$arrayByType = array();
foreach ($array as $item) {
    $arrayByType[$item['type']][] = $item;
}

然后在模板中你只需要:

{% if arrayByType["A"] is not empty %}
    <h4>A</h4>
    <ul>
        {% for value in arrayByType["A"] %}
            <li>{{ value.name }}</li>
        {% endfor %}
    </ul>    
{% endif %}

错误解决方案(在模板内):

{% set displayA = false %}
{% for item in array if item.type == 'A' %}
    {% set displayA = true %}
    {# There is no "break" in twig, so that makes this extremely suboptimal #}
{% endfor %}
{% if displayA %}
    <h4>A</h4>
    <ul>
        {% for item in array if item.type == 'A' %}
            <li>{{ value.name }}</li>
        {% endfor %}
    </ul>    
{% endif %}

答案 2 :(得分:-1)

您可以使用以下内容:

{% for value in array %}
{% if value.type !='' %}
<h4>{{ value.type }}</h4>
<ul>      
              {{ value.name }}
       </ul>
 {% endif %}
{% endfor %}