在Twig中过滤和拼接数组

时间:2017-01-17 16:49:14

标签: php arrays twig silex

我有一组用户记录(0索引,来自数据库查询),每个记录都包含一个字段数组(按字段名称索引)。例如:

Array
(
    [0] => Array
        (
            [name] => Fred
            [age] => 42
        )

    [1] => Array
        (
            [name] => Alice
            [age] => 42
        )

    [2] => Array
        (
            [name] => Eve
            [age] => 24
        )

)

在我的Twig模板中,我希望获得age字段为42的所有用户,然后将这些用户的name字段作为数组返回。然后,我可以将该数组传递给join(<br>),每行打印一个名称。

例如,如果年龄为42岁,我希望Twig能够输出:

Fred<br>
Alice

这可以在Twig开箱即用,还是我需要编写自定义过滤器?我不知道如何用几个词来描述我想要的东西,所以可能是其他人写了一个过滤器,但我找不到它。

5 个答案:

答案 0 :(得分:3)

最终解决方案是迄今为止发布的内容的混合,并进行了一些更改。伪代码是:

for each user
  create empty array of matches
  if current user matches criteria then
    add user to matches array
join array of matches

Twig代码:

{% set matched_users = [] %}
  {% for user in users %}
    {% if user.age == 42 %}
      {% set matched_users = matched_users|merge([user.name|e]) %}
    {% endif %}
  {% endfor %}
  {{ matched_users|join('<br>')|raw }}

merge只接受arrayTraversable作为参数,因此您必须将user.name字符串转换为单个元素数组,方法是将其封装在{{ 1}}。您还需要转义[]并使用user.name,否则raw将转换为<br>(在这种情况下,我希望用户的名称转义,因为它来了来自不受信任的来源,而换行符是我指定的字符串。

答案 1 :(得分:2)

在树枝中,您可以将for(.... in ....)与if条件合并:

{% for user in users if user.age == 42 %}
    {{ user.name }}{{ !loop.last ? '<br>' }}
{% endfor %}

答案 2 :(得分:1)

{% for user in users %}
    {% if user.age == 42  %}
        {{ user.name|e }}<br>
    {% endif %}
{% endfor %}

另外,你可以创建一个元素数组

{% set aUserMatchingCreteria %}
{% for user in users %}
    {% if user.age == 42  %}
        {% aUserMatchingCreteria = aUserMatchingCreteria|merge(user.name) %}
    {% endif %}
{% endfor %}

{{ aUserMatchingCreteria|join('<br>') }}

答案 3 :(得分:1)

您可以在要循环的数组上应用过滤器,如下所示:

{% for u in user|filter((u) => u.age == 42) -%}
   <!-- do your stuff -->
{% endfor %}

答案 4 :(得分:0)

从 Twig 2.10 开始,有条件地排除数组元素的推荐方法是 the filter filter。正如之前的一些答案所指出的,loop.last 有一些问题,但您可以简单地翻转逻辑并使用 loop.first,它将始终如一地工作:

{% for user in users|filter((u) => u.age == 42) %}
    {{ loop.first ?: '<br/>' }}
    {{ user.name|e }}
{% endfor %}