今天做项目时,发现页面有处数据展示不对,追踪代码后发现问题出现在foreach那,简化后的代码如下
<?php
$html='';
$question = array (
0 =>
array (
'qt_name' => '单选题',
'qt_id' => '1',
'qt_type' => '1',
),
1 =>
array (
'qt_name' => '现代文阅读',
'qt_id' => '2',
'qt_type' => '0',
),
2 =>
array (
'qt_name' => '文言文阅读',
'qt_id' => '3',
'qt_type' => '0',
),
3 =>
array (
'qt_name' => '诗歌鉴赏',
'qt_id' => '4',
'qt_type' => '0',
),
4 =>
array (
'qt_name' => '语言表达',
'qt_id' => '5',
'qt_type' => '0',
),
5 =>
array (
'qt_name' => '名著导读',
'qt_id' => '6',
'qt_type' => '0',
),
6 =>
array (
'qt_name' => '默写',
'qt_id' => '7',
'qt_type' => '0',
),
7 =>
array (
'qt_name' => '书写',
'qt_id' => '8',
'qt_type' => '0',
),
8 =>
array (
'qt_name' => '作文',
'qt_id' => '9',
'qt_type' => '0',
),
9 =>
array (
'qt_name' => '其他',
'qt_id' => '10',
'qt_type' => '0',
),
);
foreach ($question as &$qv) {
$qv['qt_count'] = 0;
}
foreach ($question as $pk => $qv) {
$html .= <<<EOT
<tr>
<td><a class="zz_left_tabtype" title="{$qv['qt_name']}">{$qv['qt_name']}</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="{$qv['qt_id']}"></a></td>
</tr>
EOT;
}
echo $html;
打印
<tr>
<td><a class="zz_left_tabtype" title="单选题">单选题</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="1"></a></td>
</tr><tr>
<td><a class="zz_left_tabtype" title="现代文阅读">现代文阅读</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="2"></a></td>
</tr><tr>
<td><a class="zz_left_tabtype" title="文言文阅读">文言文阅读</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="3"></a></td>
</tr><tr>
<td><a class="zz_left_tabtype" title="诗歌鉴赏">诗歌鉴赏</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="4"></a></td>
</tr><tr>
<td><a class="zz_left_tabtype" title="语言表达">语言表达</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="5"></a></td>
</tr><tr>
<td><a class="zz_left_tabtype" title="名著导读">名著导读</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="6"></a></td>
</tr><tr>
<td><a class="zz_left_tabtype" title="默写">默写</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="7"></a></td>
</tr><tr>
<td><a class="zz_left_tabtype" title="书写">书写</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="8"></a></td>
</tr><tr>
<td><a class="zz_left_tabtype" title="作文">作文</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="9"></a></td>
</tr><tr>
<td><a class="zz_left_tabtype" title="作文">作文</a></td>
<td align="center">0</td>
<td align="center" class="zz_left_tabjs"><div class="have"><span style="width:0%"></span><a>0%<a></div></td>
<td align="center"><a class="zz_cancel" rel="9"></a></td>
</tr>
仔细看上面的$html变量输出的值,最后面有两处是一样的,都是作文,这不应该啊,后来发现在上面我引用了foreach的地址符给数组添加了个字段,同时两处循环内的变量用的一致的,因此在第二处foreach循环时变出现了上述的错误,只需把两处的foreach循环内的设成不同的变量即可。
感觉上面的解释还是不够明确,刚刚查了下资料,第一次foreach循环时由于使用了引用,因此在循环结束时$qv的值便是$question[9]了,在第二次循环时,实际上就是循环给$question[9]赋值
$question[9] = $question[0];
$question[9] = $question[1];
$question[9] = $question[2];
.
.
.
$question[9] = $question[8];
$question[9] = $question[9];// 此时是自己给自己赋值,因此他的值还是$question[8],所以最后会出现两个作文
看上述流程,便明白了错误的原因,看来是实践出真知啊,而且出错了,可以帮助自己更加了解天天工作的语言的细节,10000小时机制啊。