PHP-smarty中Section和Foreach都是循环,它们各应该在哪些地方使用比较有优势?

PHP-smarty中Section和Foreach都是循环,它们各应该在哪些地方使用比较有优势?

清晨说ぺ晚安 发布于 2017-11-08 字数 77 浏览 1175 回复 2

smarty中Section和Foreach都是循环,它们各应该在哪些地方使用比较有优势?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜无邪 2017-11-08 2 楼

foreach 只能用于简单的循环
foreach能做到的section都能做到,但是section能做到的foreach不一定能做到。
为了补充foreach 的不足,引入了section;也可以简单的理解为 foreach 相当于php 的foreach循环,section 相当与 php的for循环

从属性上就能看出两者的不同:
foreach:
from => 待循环数组的名称
item => 当前处理元素的变量名称
key => 当前处理元素的键名
name => 该循环的名称,用于访问该循环

section :
name => 该循环的名称
loop => 决定循环次数的变量名称
start => 循环执行的初始位置. 如果该值为负数,开始位置从数组的尾部算起. 例如:如果数组中有7个元素,指定start为-2,那么指向当前数组的索引为5. 非法值(超过了循环数组的下限)将被自动调整为最接近的合法值.
step => 该值决定循环的步长. 例如指定step=2将只遍历下标为0、2、4等的元素. 如果step为负值,那么遍历数组的时候从后向前遍历.
max => 设定循环最大执行次数
show => 决定是否显示该循环

部分参考 smarty 手册

偏爱自由 2017-11-08 1 楼

smarty的的foreach在我的实际开发中比较常用,主要用于列表生成,因为数据的查询结果多以数组形式返回,相比section,foreach灵活的数组应用在smarty中非常好用,建议大家使用foreach,并且了解其特性,例如,循环次数统计,没有循环时执行的操作,后两者使用,相信很少有人注意到

用{section}可以这样,只要改变loop的值就可以改变值变量范围!
相当与php 的for ()循环,

{section loop=10000 name=a}
{$smarty.section.a.iteration} {* iteration属性并不受start 与step的影响*}
{/section}

{section loop=10000 name=a start=1 step=2}
{$smarty.section.a.index}
{/section}

foreach主要是用来针对关联数据,比较适用用于列表生产。仅能用于数组,PHP5后可以遍历对象,使用范围自然会比for小了。

section 的使用范围要更广范

举几个例子:
一、
$name=array('one','tow','three','four');

foreach输出
<{foreach item=item from=$name}>
<{$item}>
<{/foreach}>
结果
one tow three four

section输出
<{section name=name loop=$name}>
<{$name[name]}>
<{/section}>
结果one tow three four

二、
$name=array('a'=>'one','b'=>'tow','c'=>'three','d'=>'four');
这种情况下,用foreach可以输出正常
用section没有输,这就是说,section在处理一维数组是,不能处理带非数值索引的
例:可以处理array('a','b'),array(1=>'a',2=>'b'),不能处理array('a'=>'a','b'=>'b')这样的

三、
$name=array(array('title'=>'a','body'=>'b'),array('title'=>'c','body'=>'d'));
以下都可以输出
<{foreach key=key item=item from=$name}>
<{$item.title}><br>
<{/foreach}>
<{section name=name loop=$name}>
<{$name[name].title}>
<{/section}>

四、
$name=array(array('a','b'),array(‘c','d'));
以下都 可输出
<{foreach key=key item=item from=$name}>
<{$item.0}><br>
<{/foreach}>
<{section name=name loop=$name}>
<{$name[name].0}>
<{/section}>