1. 主页 > 小妙招

ThinkPHP模板中高效循环数据的volist和foreach用法详解

你是不是经常在写ThinkPHP模板时,看着别人的代码里又是volist又是foreach的,心里直打鼓?明明都是循环数据,为啥要搞两种标签?新手如何快速涨粉式掌握这两个标签的正确打开方式?今天咱们就来掰扯清楚这件事。

??volist和foreach到底有啥区别???
说白了,volist是ThinkPHP亲生的模板标签,专门为数据库查询结果设计的。好比你去餐厅点套餐,服务员直接把配好的菜端上来。而foreach就是PHP原生的语法糖,相当于自己拿着餐盘去自助区选菜。举个具体例子:

html运行复制

<volist name="dataList" id="vo">
  <li>{$vo.title}li>
volist>


{foreach $arrayData as $key=>$value}
  <div>{$value}div>
{/foreach}

??什么时候该用volist???
当你处理数据库查询结果,特别是带分页的数据时,闭着眼睛选volist就对了。它有三个独家优势:

  1. 自动识别分页数据,不用手动计算页码
  2. 支持空数据提示,避免满屏报错
  3. 内置offset和length参数,轻松实现数据切片

比如做商品列表加载更多功能:

html运行复制
<volist name="goodsList" id="item" offset="10" length="5">
  <div class="goods-item">
    <img src="{$item.cover}">
    <p>{$item.name}p>
  div>
volist>

??foreach在模板里能干啥???
虽然volist很香,但遇到这些情况还是得请出foreach:

  • 循环控制器里直接赋值的普通数组
  • 需要同时获取键名和键值
  • 要对数据进行复杂处理再输出

比如处理多级分类数据:

html运行复制
{foreach $categoryTree as $parent}
  <h3>{$parent.name}h3>
  {foreach $parent.children as $child}
    <span>{$child.name}span>
  {/foreach}
{/foreach}

??常见问题现场答疑??
Q:为什么我的volist循环不出来数据?
A:先检查三点:①变量名是否带$符号 ②数据是不是二维数组 ③有没有在控制器用->paginate()方法

Q:循环时怎么加序号?
A:volist可以直接用$i变量:

html运行复制
"list" id="vo">
  第{$i}条:{$vo.content}

Q:循环过程中能修改变量值吗?
A:用foreach时可以,但要记得加引用符:

html运行复制
{foreach $list as &$vo}
  {$vo.price = $vo.price * 0.8}
  
{/foreach}

??个人实战心得??
刚开始用的时候,我也总纠结选哪个好。后来发现个规律:只要是数据库查出来的数据,特别是带关联模型操作的,无脑用volist准没错。如果是临时拼凑的数组数据,或者需要复杂操作的,那就用foreach。最后说句大实话,新手前期先掌握volist的常规用法就够了,等遇到特殊需求再研究foreach的高级玩法,这样学习曲线最平缓。

本文由嘻道妙招独家原创,未经允许,严禁转载