Twig合并字符串至数组时索引值重复,求正确实现方式
解决Twig合并数组后所有元素均为最后一个值的问题
问题原因
你遇到的问题是因为project.main_image.make.url()属于延迟计算的对象引用,并非立即生成的静态字符串。循环结束后,数组内所有元素指向的都是最后一次循环的对象实例,最终所有值都同步成了最后一个项目的URL;同时Twig的变量作用域特性也可能加剧这类引用覆盖问题。
正确的数组合并方式
方法1:提前捕获静态字符串值
在合并数组前,先将需要的内容转换为字符串并存储到临时变量,避免引用传递导致的后续值覆盖:
{% set projectArray = [] %} {% set projectTitleArray = [] %} {% set projectQuery = entries('projects', 'projects').where('enabled', 1).orderBy('sort_order').get() %} TITLE - URL: {% for project in projectQuery %} {# 强制转换为字符串,固定当前循环的静态值 #} {% set imageUrl = project.main_image.make.url()|string %} {% set title = project.title|string %} {% set projectArray = projectArray|merge([imageUrl]) %} {% set projectTitleArray = projectTitleArray|merge([title]) %} <ul> <li>{{title}} - {{imageUrl}}</li> </ul> {% endfor %}
方法2:构建结构化数组(更推荐)
避免维护两个独立数组,直接构建包含标题和URL的结构化数组,既减少代码冗余,也能避免索引不匹配问题:
{% set projects = [] %} {% set projectQuery = entries('projects', 'projects').where('enabled', 1).orderBy('sort_order').get() %} TITLE - URL: {% for project in projectQuery %} {% set projectData = { title: project.title|string, url: project.main_image.make.url()|string } %} {% set projects = projects|merge([projectData]) %} <ul> <li>{{project.title}} - {{project.main_image.make.url()}}</li> </ul> {% endfor %} {# 组件调用时直接传递结构化数组 #} <div class="py-6 bg-slate-100"> <div class="container my-10 mx-auto"> <h1 class="section-title-1">Projects</h1> </div> <div class="xl:pl-[5rem]"> <product-projects :projects="{{projects|json_encode(constant('JSON_PRETTY_PRINT'))}}"></product-projects> </div> </div>
关键说明
- 使用
|string过滤器强制将对象转换为静态字符串,确保数组存储的是当前循环的固定值,而非后续会变化的对象引用。 - 结构化数组的方式更符合代码可维护性要求,后续修改或扩展字段时更便捷。
内容的提问来源于stack exchange,提问作者Shulz
相关产品推荐
相关产品推荐

