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

Smarty模板引擎foreach方法失效,如何改用while循环实现?

解决Smarty foreach失效问题:改用while循环实现表单数据传递

首先得提一句你原代码里的小疏漏:当前的foreach循环中,每次调用$smarty->assign('postdata', ...)都会覆盖之前的赋值,最后Smarty只能拿到最后一个符合条件的键值对。不管用foreach还是while,我们都得先把所有需要的POST数据整理成一个数组,再一次性传给Smarty,这样模板里才能遍历生成所有输入框。

后端PHP改用while循环的实现代码

// 初始化空数组存储需要的POST数据
$postDataArray = [];

// 重置SESSION数组指针,确保从第一个元素开始遍历
reset($_SESSION['POSTDATA']);

// 使用while循环遍历SESSION中的POSTDATA
while (list($key, $value) = each($_SESSION['POSTDATA'])) {
    // 排除不需要的键
    if ($key !== 'ACTION' && $key !== 'AES_KEYS') {
        $postDataArray[] = [
            'id' => $key,
            'name' => $key,
            'value' => $value
        ];
    }
}

// 把整理好的数组传给Smarty
$smarty->assign('postdata', $postDataArray);

// 清空SESSION中的POSTDATA(用空数组更规范)
$_SESSION['POSTDATA'] = [];

对应的Smarty模板代码

如果只是后端改用while,模板里依然可以用Smarty的{foreach}来遍历(这也是最常用的方式):

{foreach from=$postdata item=item}
    <input type="hidden" id="{$item.id}" name="{$item.name}" value="{$item.value}">
{/foreach}

要是模板里的foreach也没法正常用,那模板里也可以改成while循环:

{assign var="index" value=0}
{while $index < count($postdata)}
    {assign var="item" value=$postdata[$index]}
    <input type="hidden" id="{$item.id}" name="{$item.name}" value="{$item.value}">
    {assign var="index" value=$index+1}
{/while}

额外小提示

  • list($key, $value) = each($array)是PHP传统的while遍历数组写法,配合reset()能保证从数组开头开始遍历
  • 清空SESSION数据时,用[](空数组)比空字符串更符合数组类型的使用规范

内容的提问来源于stack exchange,提问作者Артемий Джикия

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:41:34