如何将标量树枝过滤器映射到数组

How to map scalar twig filter to array

我有一个简单的浮点数组。我需要将其显示为逗号分隔的字符串。

{{ arr|join(', ') }}

是一个糟糕的解决方案,因为过于微不足道的准确性。

{% for val in arr %}
    {{val|number_format(2)}},
{% endfor %}

不好,因为末尾有多余的逗号。

我想做这样的事情:

{{ arr|map(number_format(3))|join(', ') }}

但我还没有找到过滤器 map 或类似的过滤器 Twig。 Аnd 我不知道如何实现这样的过滤器。

为什么不使用 loop 变量?

{% for val in arr %}
    {{val|number_format(2)}}
    {% if not loop.last %}, {% endif %}
{% endfor %}

快速回答 (TL;DR)

详细解答

上下文

  • Twig 2.x(截至 2017 年 2 月 8 日星期三的最新版本)

问题

  • 场景: DeveloperGarricSugas 希望将 higher-order 函数应用于 Twig 变量
    • 高阶函数允许对任何 Twig 变量进行各种转换
  • Twig 对 higher-order 函数的支持有限
  • 尽管如此,存在用于此的插件库
  • 自定义过滤器或函数也可以用来模拟这个

例子01

  • DeveloperGarricSugas 以 sequentially-indexed 数组开始
  • BEFORE转换成AFTER(首字母大写)
{%- set mylist = ['alpha','bravo','charlie','delta','echo']  -%}

BEFORE: 
['alpha','bravo','charlie','delta','echo']

AFTER: 
['Alpha','Bravo','Charlie','Delta','Echo']

解决方案

{%- set mylist = mylist|map(=> _|capitalize)  -%}    

陷阱

  • Twig higher-order 功能有限支持来自 addon-libraries
  • 以上解决方案不适用于原生 Twig

另见

快速回答 (TL;DR)

  • 替代方法是使用 Twig 循环(解决方法)

解决方法

{%- set aaold = [1.234,234.56,11.222,22.333]  -%}
{%- set aanew = []  -%}
{% for item in aaold -%}
  {{ aanew|merge(item|number_format(3)) }}
{% endfor %}
{{ aanew | join(', ') }}

陷阱

  • 需要使用 array|merge
    • 替代 array|merge ... loop.firstloop.last 指定
  • 需要添加循环控制结构,这意味着额外的代码膨胀