在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啊!
現在我們可以指明這個游標變量的名字看看
果然解析后的代碼如下
看到了吧,這樣就不會游標元素值就不會自增了,而是索引自增。
這回是徹底搞明白了,哈哈哈