如何将标量树枝过滤器映射到数组
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)
- 此问题与 higher-order 函数有关
- 地图是一个higher-order函数
- (参见示例)https://en.wikipedia.org/wiki/Map_(higher-order_function)
- (参见示例)https://en.wikipedia.org/wiki/Higher-order_function
详细解答
上下文
- 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.first
或 loop.last
指定
- 需要添加循环控制结构,这意味着额外的代码膨胀
我有一个简单的浮点数组。我需要将其显示为逗号分隔的字符串。
{{ 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)
- 此问题与 higher-order 函数有关
- 地图是一个higher-order函数
- (参见示例)https://en.wikipedia.org/wiki/Map_(higher-order_function)
- (参见示例)https://en.wikipedia.org/wiki/Higher-order_function
详细解答
上下文
- 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.first
或loop.last
指定
- 替代
- 需要添加循环控制结构,这意味着额外的代码膨胀