Twig数组转换为字符串

27

这可能相对容易做到,但我对Twig不熟悉而且感到沮丧。

我正在调整来自这个答案的代码:https://dev59.com/82Ag5IYBdhLWcg3wBXKs#24058447

这个数组是通过PHP使用这种格式创建的:

$link[] = array(
       'link' => 'http://example.org',
       'title' => 'Link Title',
       'display' => 'Text to display',
);

然后通过 twig,我为其添加 HTML,再将其合并:

    <ul class="conr">
        <li><span>{{ lang_common['Topic searches'] }} 
        {% set info = [] %}
        {% for status in status_info %}
            {% set info = info|merge(['<a href="{{ status[\'link\'] }}" title="{{ status[\'title\'] }}">{{ status[\'display\'] }}</a>']) %}
        {% endfor %}

        {{ [info]|join(' | ') }}
    </ul>

但我得到的是:

错误码[8]:将数组转换为字符串,位于F:\localhost\www\twig\include\lib\Twig\Extension\Core.php 的第832行

当我删除这一行时问题解决了,但没有显示内容:

{{ [info]|join(' | ') }}

有什么方法可以正确地使这个东西崩溃?

** 更新 **

使用Twig的dump函数返回了空值。似乎它甚至没有将其加载到数组中。我如何将信息加载到新数组中。


如果您在2023年阅读此内容,join将支持两个参数:glueand("and: 用于最后一对输入项的分隔符[...] and参数已在Twig 1.37中添加。")。 - Sandra
4个回答

60

info是一个数组,所以你应该简单地编写

{{ info|join(', ') }}
显示您的信息数组。
[info] 是一个仅包含一个值的数组:信息数组。

注意:在关联数组的情况下,仅使用值进行操作。 - Delphine
4
如果您想连接一个关联数组的键,您可以先通过keys过滤器将数组传递进去,例如:{{ info | keys | join(', ') }} - Dan Abrey

15
您不应该在Twig模板中构建复杂的数据结构。您可以通过更符合语言习惯和易于阅读的方式来实现所需的结果,例如:
{% for status in status_info %}
    <a href="{{ status.link }}" title="{{ status.title }}">{{ status.display }}</a>
    {% if not loop.last %}|{% endif %}
{% endfor %}

问题在于如何将其分隔。我需要每个元素之间用“|”分隔,但是当我手动执行此操作时,页面右侧会多出一个“|”。这是我能想到的唯一方法,以获取所需数量。 - Chris98
那... 这就是 if not loop.last 应该避免的吗?! - deceze
好的。谢谢。我从未听说过那个。我对Twig还不是很熟悉。 - Chris98

13
您可以使用json_encode将数组序列化为字符串,然后在twig中使用内置的格式漂亮显示。

    {{ array|json_encode(constant('JSON_PRETTY_PRINT')) }} 
    


3
请进一步解释一下 - 你的代码是做什么的?请记住,其他人应该能够从这段代码中学到东西。 - Nico Haase
这是最佳答案,因为它将整个结构转换为字符串,而join如果变量是嵌套数组(例如尝试['a',['b']])则会失败。用于调试非常有用。 - Fabien Snauwaert

2
如果需要关联数组:
{{info|json_encode(constant('JSON_PRETTY_PRINT'))|raw}}

2
请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase
抱歉,但['TEXT']不太好看:D - anyapps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接