在 Twig 模板中创建 JSON 输出时出现问题

Problem creating JSON outuput in Twig Template

我正在学习使用 Craft CMS,它使用 Twig 模板。我试图在 Twig 中输出一个 JSON 对象,但我得到的不是 JSON 中的 2 个项目,而是一个项目的信息。

这是我的代码:

{% set newsitems = craft.entries.section('newsitems').orderBy('PostDate desc').limit(100) %}

{% set response = [] %}
{% for newsitem in newsitems %}
    {{ 'Here' }}
    {% set response = response|merge({'type':0, 'id':newsitem.id, 'link':newsitem.sourceLink}) %}
{% endfor %}

{{ response|json_encode() }}

这是我得到的输出:

Here Here {"type":0,"id":"25","link":"https:\/\/gadgets.ndtv.com"}

可以看出,循环执行了两次('Here'被打印了两次)但是JSON数组中只有一项被打印了。

我是不是漏掉了一些基本的东西?任何帮助,将不胜感激。提前致谢。

Twig 的 merge 过滤器在后台使用 array_merge

手册说明如下

If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. If, however, the arrays contain numeric keys, the later value will not overwrite the original value, but will be appended.

这就是您的输出发生的情况,在第一次迭代中您创建了一个关联数组,其键为:typeidlink。在第 x 次迭代中,您只是覆盖存储在所述键中的值。解决方法在手册中也有说明,数字索引将附加到数组而不是覆盖它。

twig中你可以这样解决:

{% set response = [] %}
{% for newsitem in newsitems %}
    {% set response = response|merge([{ 'type': 0, 'id': newsitem.id, 'source': newsitem.source,},]) %}
{% endfor %}

{{ response|json_encode|raw }}

demo