在thinkphp5的volist标签中不要用$i作为id,举个简单例子

控制器这样写

模板这样写

结果是

这很令人费解啊。然后换一个循环变量看看

循环正常了,看来这个id这里设置循环变量的时候 不能设置为i。翻看手册 发现有一条

这说明了key属性默认是i,这样一来冲突了,出现了覆盖,就出现了奇怪现象,最后一个单词总是比实际的后移了一位ascii码 比如 php变为了phq,mysql变为了mysqm,linux变为了linuy,都是差一位,这真是一个奇怪的现象啊

然后我看了一下框架解析标签后的代码,在runtime/tmp里面

找到了代码

<?php if(is_array($list) || $list instanceof \think\Collection || $list instanceof \think\Paginator): $i = 0; $__LIST__ = $list;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$i): $mod = ($i % 2 );++$i;?>
<?php echo $i; ?><br/>
<?php endforeach; endif; else: echo "" ;endif; ?>

这代码不太好理解,我删掉了部分,得到如下

<?php if(is_array($list): $i = 0; $__LIST__ = $list;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$i): $mod = ($i % 2 );++$i;?>
<?php echo $i; ?><br/>
<?php endforeach; endif; else: echo "" ;endif; ?>

这是用的PHP的原始的foreach和if的标签,我更改一下这个标签就变为

<?php
if(is_array($list)
{
$i = 0;
$__LIST__ = $list;
if( count($__LIST__)==0 )
{
echo "" ;
}else{
foreach($__LIST__ as $key=>$i)
{
$mod = ($i % 2 );++$i;
echo $i;
?>
<br/>
<?php
}
}else
{
echo "" ;
}
}
?>

我们可以看到,主要是foreach循环这一步,简化一下,由于 $list赋值给$__LIST__然后用$__LIST__循环出来的,所以可以直接简化为

从这里我们看到了,循环之后 $mod几乎没起到什么作用,然后就++$i然后输出$i,我们直接做测试看看

果然我们复现了问题,其实就是每个循环的游标变量都自增了一下,然后被输出,这就是为什么 php变为了phq,mysql变为了mysqm,linux变为了linuy,原来如此啊,看来我们不能大意,不要随便给volist标签中的id赋值为i啊!

现在我们可以指明这个游标变量的名字看看

果然解析后的代码如下

看到了吧,这样就不会游标元素值就不会自增了,而是索引自增。

这回是彻底搞明白了,哈哈哈

THINKPHP5 volist标签循环不能设置循环变量为$i的更多相关文章

  1. Thinkphp5.0 的视图view的循环标签

    Thinkphp5.0 的视图view的循环标签 volist标签: <!-- 使用volist --> <!-- name是传递过来的要循环变量名 --> <!-- k ...

  2. 为什么说for循环设置循环变量的那部分是一个父作用域?

    最近在看阮一峰老师的<ES6> 看到let时,发现一处for循环很神奇的地方. 书中的原话是:“另外,for循环还有一个特别之处,就是设置变量的那部分是一个父作用域,而循环体内部是一个单独 ...

  3. ThinkPhp5 中Volist标签的用法

    Volist标签一般是和内置方法assign()搭配使用,将值从后台传到前台,是当下比较流行的一种传值方法 本文实例讲述了ThinkPHP模板循环输出Volist标签用法.分享给大家供大家参考,具体如 ...

  4. bash的循环中无法保存变量

    在bash中,如果循环在一个子shell中运行,那么在循环中对循环外面的变量的更改将在循环退出后不可见.像下面的例子: #!/bin/sh python run.py | while read lin ...

  5. 【Javascript】: for循环中定义的变量在for循环体外也有效

    for循环中定义的变量在for循环体外也有效 <script> (function(){ var a = 111; for(var i=0;i<5;i++){ var carl = ...

  6. 原创:如何实现在Excel通过循环语句设置指定行的格式

    原创:如何实现在Excel通过循环语句设置指定行的格式 一.需求: 想让excel的某些行(比如3的倍数的行)字体变成5号字 如何整: 二.实现: Sub code() To Range(" ...

  7. 11 tensorflow在tf.while_loop循环(非一般循环)中使用操纵变量该怎么做

    代码(操纵全局变量) xiaojie=1 i=tf.constant(0,dtype=tf.int32) batch_len=tf.constant(10,dtype=tf.int32) loop_c ...

  8. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制

    不可在 for 循环体内修改循环变量,防止 for 循环失去控制. #include <iostream> /* run this program using the console pa ...

  9. 每个分组函数相当于一个for循环 将集合的变量不断遍历

    每个分组函数相当于一个for循环  将集合的变量不断遍历

随机推荐

  1. redis源码分析

    我阅读的源码版本是redis-2.8.19 src目录下总共96个.h,.c文件 1. 数据结构相关源码(15个左右)字符串代码: sds.h, sds.c字典:dict.h, dict.c链表: a ...

  2. 使用HttpClient实现并发请求

    在.Net 4.0之前,一直是依靠HttpWebRequest实现Http操作的.它默认有一个非常保守的同一站点下最大2并发数限制,导致默认情况下HttpWebRequest往往得不到理想的速度,必须 ...

  3. 使用 Docker 搭建 Tomcat 运行环境

    转自: http://m.oschina.net/blog/616526, 版权归原作者所有. 1 Docker与虚拟机     2 搭建过程 2.1 准备宿主系统 准备一个 CentOS 7操作系统 ...

  4. ${pageContext.request.contextPath}无法解析

    摘要 突然出现无法解析${pageContext.request.contextPath}的问题,在点击<a href="${pageContext.request.contextPa ...

  5. AutoMapperExtension

    using System; using System.Collections.Generic; using System.Linq; using AutoMapper; using System.Co ...

  6. 【PMP】挣值分析

    挣值分析(EVA):将实际进度和成本绩效与绩效测量基准进行比较. 1.名词解释 1.1 三个指标 PV [Plan value]  计划价值 官方释义:为计划工作分配的经批准的预算,它是为完成某活动或 ...

  7. GDALSetProjection使用的一个注意事项

    GDALSetProjection 简述 GDALSetProjection是用来给GDALDataset设定投影信息(坐标系统)的接口,实际上是GDALDataset::SetProjection这 ...

  8. Delphi读取不Word中不规则表格数据并转换成标准表格

    程序需要,需要将word中不规则的表格数据转换为标准的表格,即合并的单元格按正常格式解析,word中的表格格式如下: 解析后数据如下: 借鉴了网上代码,如下处理: procedure TfrmMain ...

  9. 在Asp.Net中操作PDF – iTextSharp - 操作图片

    iTextSharp支持所有主流的图片格式,比如:jpg, tif, gif, bmp, png和wmf.在iTextSharp中使用Image.GetInstance()方法创建图片有很多种方式,或 ...

  10. React Native 设置RGBA背景色

    React Native 设置RGBA背景色: 可以先用Mac自带吸色工具,获取RGB值,然后设置背景如下: backgroundColor: 'rgba(52, 52, 52, 0.8)', 透明度 ...