在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. fatal error C1859 意外的预编译头错误,只需重新运行编译器(转)

    微软的建议 要解决此问题,请使用下列方法之一. http://support.microsoft.com/kb/976656/zh-cn 方法 1 禁用/analyze编译器选项,则它会被启用. 方法 ...

  2. 【BZOJ3036】绿豆蛙的归宿 概率DP

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  3. 深入理解 Java try-with-resource 语法糖

    背景 众所周知,所有被打开的系统资源,比如流.文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故. 在Java的江湖中,存在着一种名为fina ...

  4. Linux网络编程:socket文件传输范例

    基于TCP流协议的socket网络文件传输Demo: 实现:C语言功能:文件传输(可以传任何格式的文件) /********************************************** ...

  5. 浅谈压缩感知(二十):OMP与压缩感知

    主要内容: OMP在稀疏分解与压缩感知中的异同 压缩感知通过OMP重构信号的唯一性 一.OMP在稀疏分解与压缩感知中的异同 .稀疏分解要解决的问题是在冗余字典(超完备字典)A中选出k列,用这k列的线性 ...

  6. 使用SpringBoot入门案例

    一.创建项目 二.给根项目UnicomCmp的pom.xml,加入parent节点(spring-boot-starter-parent) <!--Add Spring boot Parent- ...

  7. MongoDB副本集配置系列七:MongoDB oplog详解

    1:oplog简介 oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的.每个节点都有oplog,记录这从主节点复制过来的信息,这样 ...

  8. 【Babble】批量学习与增量学习、稳定性与可塑性矛盾的乱想

    一.开场白 做机器学习的对这几个词应该比较熟悉了. 最好是拿到全部数据,那就模型慢慢选,参数慢慢调,一轮一轮迭代,总能取得不错效果. 但是面对新来数据,怎么能利用已经训练好的模型,把新的信息加进去? ...

  9. Android 手动调用 返回键

    有人想通过下面代码来实现手动调用返回键,很可惜会出现空指针异常. this.onKeyDown(KeyEvent.KEYCODE_BACK, null); 我们可以通过调用 onBackPressed ...

  10. appium 获取android 粘贴板上的内容

    appium 新版本增加了获取粘贴板的内容.如果使用appium旧版本,获取粘贴板的内容不是那么容易的,甚至百度谷歌各种搜,都无法找到合适的解决方法.新版本获取android 粘贴板内容就显得很容易了 ...