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,提问作者Артемий Джикия
相关产品推荐
相关产品推荐

