关于php中foreach循环地址符及变量应注意的问题

今天做项目时,发现页面有处数据展示不对,追踪代码后发现问题出现在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小时机制啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值