工作学习笔记_foreach_效率

    今天在工作中遇到一个需求,需要在数据表格中展示昨天与今天数据对比,我首先通过foreach嵌套来完成功能需求,具体过程如下:
    1.通过数据库分别查询今天以及昨天的数据
//今天数据 
$sql1 = "select tid,sum(total) as total from $table where tdate='2013-09-16' group by tid ";
$todayArr = mysql_query($sql1);
//昨天数据
$sql2 = "select tid,sum(total) as total from $table where tdate='2013-09-15' group by tid"; 
$yesArr = mysql_query($sql2);
//查询获得如下结构数组数据
$todayArr = array(
    '0' => array(
        'tid' => 1,
        'total' => 123
    ),
    '1' => array(
        >'tid' => 1,
        'total' => 321
    )

    ...

    '$foo' => array(
        'tid' => $foo,
        'total' => $foo
    )
);


$yesArr = array(
    '0' => array(
        'tid' => 1,
        'total' => 456
    ),
    '1' => array(
        'tid' => 1,
        'total' => 654
    )

    ...

    '$foo' => array(
        'tid' => $foo,
        'total' => $foo
    )
);
2.通过foreach嵌套组装需要的数组
foreach($todayArr as $key => $value){
    foreach($yesArr as $k => $v){
        //tid 为主键唯一值
        if($value['tid']==$v['tid']){
            $todayArr[$key]['yes_total'] =	$v['total']; 
        }
    } 
}
这样编码是可以完成程序功能需求,但是当有实际的数据的量比较大时[我调试功能时的天数据是4000多条],这样子的嵌套就会有16000多次的循环轮询,导致最终页面运行数据十分缓慢,我通过microtime计算代码的执行时间是17秒左右的[功能需求数据不分页查询]。
这样子就想到减少循环次数来提高页面执行速度,循环部分做了如下修改
foreach($todayArr as $key => $value){
    foreach($yesArr as $k => $v){
        if($value['tid']==$v['tid']){
            $todayArr[$key]['yes_total'] = $v['total'];
            break; 
        }
    } 
}
tid值唯一,当循环判断条件成立之后则后面条件一定不成立,跳出当前循环。这样的处理减少了循环的次数,页面响应速度可以提高1~2秒,但是还是很慢。
接着想到,tid值唯一,对应唯一的key值,可以由昨天数组数据tid值来确定昨天数据与今天数据的关联关系,循环部分修改代码如下
$fooArr = array();
foreach($todayArr as $key => $value){
    $fooArr[$value['tid']] = $key;
}
foreach($yesArr as $key => $value){
    $todayArr[$fooArr[$value['tid']]]['yes_total'] = $value['total'];
}
通过两次单个foreach循环,组装关联数组,确定今天与昨天数据对应关系,验证现在页面响应数据大约为2s,提升了15秒。
以上是我的工作学习笔记记录,如有错误或其他指导意见,感谢你的评价。

你可能感兴趣的:(foreach嵌套)