Twig表单视图嵌套数组循环中动态键值读取失败问题求助
核心原因
Twig 中点号 . 的数组取值逻辑和原生PHP、JavaScript完全不同:
- 只要是点号后面跟的内容,Twig 一律当作固定字面键去数组里匹配,不会自动判断这个位置是不是存了键名的变量。
- 比如写
csvRowData.0.gman1时,Twig 根本不会关心gman1是不是被赋值成了'ward',它只会实打实去找「csvRowData第0个元素下,有没有叫gman1的键」——找不着自然就没输出。这就是字面键能正常取值、换动态变量就失效的根本原因。
动态取值的实现方案
两种经过验证的写法,完全适配现有嵌套循环结构:
方案一:用中括号触发动态键解析
Twig 识别中括号语法时,会自动把括号里的内容当变量解析,取出变量存的字符串当匹配的键名,只要把原先点号的写法换成中括号就行:
- 无效写法:
{% set inputVal = value.gman1 %} - 生效写法:
{% set inputVal = value[gman1] %}
对应代码里硬编码取value.ward的input标签,也可以统一改成动态取值,省得后续加新字段还要单独改代码:
<input type='text' value="{{ value[slValue.name] }}" data-type="{{ slValue.name }}" name="{{ key }}[{{ slValue.name }}]" class="{{ slValue.inpt_class }}" placeholder=". {{ slValue.placeholder }}" >
额外修正:原代码里input的name属性硬编码了
0[{{slValue.name}}],循环生成所有行表单时,数组索引前缀都是固定的0,最终提交表单时所有行的数据会互相覆盖,只剩最后一行的内容。可以直接用外层循环拿到的key变量(就是csvRowData的索引值0、1、2)当动态前缀,保证提交的数组结构正确。
方案二:用内置attribute函数取值
如果使用的是版本较老的Twig,碰到中括号动态键解析不生效的兼容场景,可以用Twig内置的attribute函数完成取值:
- 函数逻辑:传入目标数组和存储键名的变量,自动解析变量值作为键完成匹配
- 对应写法:
{% set inputVal = attribute(value, gman1) %}
内容的提问来源于stack exchange,提问作者gman_donster
相关产品推荐
相关产品推荐

