You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:20:32