Smarty模板foreach遍历对象数组仅循环一次问题求助
问题原因
你遇到的问题核心由两个常见错误导致:
- Smarty 变量调用时遗漏了
$前缀,你写的from=myArray会被Smarty识别为常量myArray而非你赋值的数组变量,常量未定义时会被识别为字符串,最终仅能遍历出1个元素 - 混淆了服务端Smarty语法和前端JS语法的执行时机:Smarty是服务端渲染引擎,所有
{}标签的逻辑在页面输出到浏览器前就已经执行完成,无法读取前端JS中定义的变量
解决步骤
场景1:数组是在PHP后端定义,需要Smarty渲染
- 第一步:确保PHP端正确赋值PHP数组给Smarty
// 后端PHP代码 $myArray = [ ['name' => 1], ['name' => 2], ['name' => 3] ]; $smarty->assign('myArray', $myArray);
- 第二步:模板中使用正确的Smarty语法遍历(变量必须加
$前缀)
<!-- 兼容所有Smarty版本的写法 --> {foreach from=$myArray item=item key=key} console.log("{$key}"); console.log("{$item.name}"); {/foreach} <!-- Smarty3+ 简化写法 --> {foreach $myArray as $key => $item} console.log("{$key}"); console.log("{$item.name}"); {/foreach}
- 验证方法:可在模板顶部添加以下代码打印变量结构,确认数组格式正确
{$myArray|print_r}
场景2:数组是在前端JS中定义,直接用JS原生遍历即可,不需要调用Smarty语法
const myArray = [ { name: 1}, { name: 2}, { name: 3} ]; myArray.forEach((item, index) => { console.log(index); console.log(item.name); });
嵌套foreach报错说明
你之前嵌套遍历报错的原因是外层遍历因为漏写$拿到的不是数组/对象结构,内层去遍历非数组类型的变量自然会触发报错,修正外层语法后嵌套遍历即可正常运行。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

