循环遍历 Foreach

循环遍历 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}
添加日期: