volist是ThinkPHP模板专属标签,要求传入数据为数组或可转数组的对象;name必须与assign键名一致,id为循环变量名;支持offset、length等属性实现分页截取,嵌套需确保子数据为数组且不超过默认3层深度。

volist 标签不是 PHP 语法,它只在 ThinkPHP 模板中生效,且对传入数据类型敏感;直接传 stdClass 或未 toArray() 的查询结果会静默失败或报 Invalid argument supplied for foreach()。
volist 的 name 和 id 参数必须匹配控制器 assign
控制器里用 $this->assign('list', $data),模板里 {volist name="list" id="vo"} 的 name 就必须是 "list",不能写成 "data" 或漏引号。id 是循环内可用的变量名,可自定义(如 id="item"),但不能和 name 值重复。
- 常见错误:控制器传的是
$this->assign('users', $query->select()),模板却写{volist name="user" ...}→ 渲染为空,无报错 - Collection 对象(如
Db::table()->select()返回值)可直接用 volist;但->find()返回单条记录,需包成数组:$this->assign('list', [$result]) - 若数据来自
stdClass实例(如json_decode($json, false)),volist 会失败;应改用json_decode($json, true)确保返回数组
volist 的 offset、length、mod、key 都是实用属性,别手动写计数逻辑
volist 内置分页与样式控制能力,比手写 {foreach} 更简洁安全。比如截取前 5 条并 fallback,一行搞定:
{volist name="list" id="item" length="5" empty="暂无数据"}
<div>{$item.title}</div>
{/volist}
-
offset="2"表示跳过前 2 条(从第 3 条开始);length="3"表示最多取 3 条;二者组合可实现“第 3~5 条” -
mod="2"后,模板内可直接用{$mod}获取当前余数(0 或 1),配合{eq name="mod" value="0"}控制隔行样式 -
key="k"生成从 1 开始的序号(不是数组键),{$k}可用于显示“第 {$k} 条”,避免依赖数据本身的id
嵌套 volist 必须确保子数据是数组,且层级不超过默认限制
多级菜单、分类+子项等场景常用嵌套,但容易因数据结构不匹配白屏:
{volist name="categories" id="cat"}
<h3>{$cat.name}</h3>
{volist name="cat.sub_list" id="sub"}
<p>→ {$sub.title}</p>
{/volist}
{/volist}
- 外层
categories必须是数组,且每个$cat必须含sub_list字段,且该字段值为数组(空数组也行);若为null或stdClass,内层 volist 直接报错 - ThinkPHP 默认嵌套深度为 3 层;若需四层嵌套,需在配置中显式设
TAG_NESTED_LEVEL = 4 - 不建议在 volist 内调用方法(如
name="item.getSubItems()"),模板层应只做展示,逻辑收口到控制器
真正容易被忽略的是数据“形态”——volist 不校验内容是否合法,只认接口是否满足 toArray() 或数组协议。传错类型不会报错,只会渲染为空,排查时得倒查控制器 assign 前的数据源类型,而不是盯着模板标签本身。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











