twig中遍历数组最直接且唯一推荐的方式是{% for %}标签,支持索引数组、关联数组及traversable对象,自动处理空值,无需额外转换。

Twig 中用 {% for %} 遍历数组最直接
Twig 没有 forEach 或 map 这类函数式写法,标准且唯一推荐的方式就是 {% for %} 标签。它原生支持索引数组、关联数组(即 PHP 的 array)、Traversable 对象(如 Doctrine Collection),无需额外转换。
常见错误是试图用 {{ array|json_encode }} 后再 JS 解析——完全没必要,Twig 本身就能处理。
- 遍历索引数组:
{% for item in items %}{{ item }}{% endfor %} - 遍历关联数组并获取键名:
{% for key, value in user %}{{ key }}: {{ value }}{% endfor %} - 带索引序号(从 0 开始):
{% for item in items %}{{ loop.index0 }}. {{ item }}{% endfor %} - 空数组安全:若
items为null或空数组,{% for %}自动跳过,不报错
关联数组里键含点号(如 user.profile.name)怎么取值?
Twig 默认把带点的键名当作嵌套访问,比如 user.profile.name 会被解析成 user['profile']['name'],而不是字面键 "user.profile.name"。如果数组真实键名含点(极少见但可能出现在 API 响应或 legacy 数据中),必须用括号语法。
- 错误写法:
{{ data.user.profile.name }}→ Twig 尝试深层访问,报Key "profile" for array with keys "user.profile.name" does not exist - 正确写法:
{{ data['user.profile.name'] }} - 在
{% for %}中也一样:{% for key, value in data %}{{ key }} → {{ data[key] }}{% endfor %}是安全的,因为key是字符串变量,不会触发点号解析
loop 变量能做什么?别只记得 index
loop 是 {% for %} 内置的上下文对象,比单纯计数有用得多,尤其在渲染列表、分页、条件样式时。
-
loop.first/loop.last:判断是否首项或末项,适合加 class 或分隔符 -
loop.index(从 1 开始)和loop.index0(从 0 开始):注意别混用,分页场景常用index -
loop.length:当前遍历数组总长度,可用于“共 X 条”提示,但注意它在每次循环中都重复计算,大数据集略影响性能 -
loop.revindex:倒序序号(从length到 1),比手动算loop.length - loop.index + 1更清晰
示例:给列表最后一项加 last-item class:{% for item in items %}<div class="{% if loop.last %}last-item{% endif %}">{{ item }}</div>{% endfor %}
数组嵌套太深或结构不确定,怎么避免 Impossible to access an attribute 错误?
这是 Twig 最常见的运行时错误,本质是某层属性/键不存在(比如 post.author.name 中 author 为 null)。不能靠 PHP 层预处理所有字段,得用 Twig 安全操作符。
- 用
??提供默认值:{{ post.author.name ?? '匿名' }},比|default('匿名')更简洁、更早生效 - 多层安全访问:
{{ post.author?.name ?? '未知作者' }}(Twig 3.5+),?.表示“可选链”,任一环节为null就短路返回null,再由??拦截 - 检查是否存在:
{% if post.author is defined and post.author.name is not empty %},比连写多个is defined更可靠
注意:|default 在值为 false、0、'' 时也会触发,默认行为不如 ?? 精准;而 ?. 要求 Twig ≥ 3.5,老项目需确认版本。
Twig 数组遍历本身很简单,真正容易卡住的是键名特殊性、嵌套空值、以及对 loop 和安全操作符的细节掌握——尤其是 ?. 和 ?? 的组合,很多人只用其中一个,漏掉另一层防护。











