循环遍历 Foreach
{foreach} 用于遍历数组(或可遍历对象),是模板里最基础的循环标签。DouPHP 专属的 {list} / {category} 在循环层与它完全一致,只是数据源改为自动从 Portal 取数。
一、语法
{foreach from=$数组变量 item=值变量 [key=键变量] [name=循环名称] [limit=数量] [offset=起始位置]}
...
{foreachelse}
数组为空时显示
{/foreach}
二、参数说明
| 参数 | 必需 | 说明 |
|---|---|---|
from |
是 | 待遍历的数组或对象 |
item |
是 | 当前元素的值变量名(字面标识符) |
key |
否 | 当前元素的键变量名 |
name |
否 | 循环名称(用于 $douview.foreach.NAME.* 访问;省略时自动生成) |
limit |
否 | 最多循环次数(取数后切片,类似 array_slice) |
offset |
否 | 跳过的元素数量(从 0 开始) |
三、基本示例
{foreach from=$articles item=article key=k}
<li>{$k}: {$article.title}</li>
{foreachelse}
<li>暂无文章</li>
{/foreach}
四、limit / offset 分页
{* 只显示前 10 条 *}
{foreach from=$news item=news limit=10}
<li>{$news.title}</li>
{/foreach}
{* 跳过前 5 条,显示接下来的 10 条 *}
{foreach from=$news item=news limit=10 offset=5}
<li>{$news.title}</li>
{/foreach}
引擎把 limit / offset 编译为对 from 数据的 array_slice(先切片再循环),两者都是编译期字面量。
五、{foreachelse} 空态分支
当 from 数据为空时,执行 {foreachelse} 与 {/foreach} 之间的内容。编译产物等价于 if (总数 > 0): foreach ... endforeach; else: ... endif;。
六、编译期约束
item/key/name必须为字面标识符(变量名),不可为表达式或运行时变量,否则编译期报'item' must be a variable name。from可为任意表达式(变量、属性路径等)。- 循环元数据(总数、当前迭代号)写入
$ctx->loops,item变量名到循环名的映射写入$ctx->loopVarmap,供@property取值(见「循环属性 Loop Properties」篇)。
七、嵌套循环
{foreach} 可嵌套;内外层用不同的 item 变量名区分:
{foreach from=$groups item=group}
<h3>{$group.name}</h3>
<ul>
{foreach from=$group.items item=it}
<li>{$it.title}</li>
{/foreach}
</ul>
{/foreach}