为了账号安全,请及时绑定邮箱和手机立即绑定

php代码优化建议

php代码优化建议

PHP
千巷猫影 2019-03-14 15:24:11
代码如下:$list数据量是上千条;$userJobnumberArray大概有几万条数据。但是这种循环执行起来非常慢,请问有什么优化的方法? $list = array( '1' => array('1','6','124'), '2' => array('2','5','156'), '4' => array('4','734','221') ); $userJobnumberArray = array( array( 'deptid' => '1', 'jobnumber' => 'X1414' ), array( 'deptid' => '734', 'jobnumber' => '34j6' ), ); $userGroup = array(); foreach ($list as $k => $v) { foreach ($userJobnumberArray as $l => $j) { if (in_array($j['deptid'], $v)) { $userGroup[$k][] = $j['jobnumber']; unset($userJobnumberArray[$l]); } } }
查看完整描述

8 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

其实,你只需要先把$userJobnumberArray数据的先用一次循环把他改成$userJobnumberArray=[deptid=>jobnumber] 这个格式,然后在执行你的外循环,内循环就不要了,直接判断 isset($userJobnumberArray[deptid]),如果存在就直接取就好了.

下面这个如何???能优化地方,也就是in_array() 这个 时间复杂度为n的操作变成了 数组索引调用这个复杂度为1的调用。

<?php

$list = array(
    '1' => array('1','6','124'),
    '2' => array('2','5','156'),
    '4' => array('4','734','221')
);

$userJobnumberArray = array(
    array(
        'deptid' => '1',
        'jobnumber' => 'X1414'
    ),
    array(
        'deptid' => '734',
        'jobnumber' => '34j6'
    ),
);

$ujba = [];

foreach($userJobnumberArray as $v){
    $ujba[$v['deptid']]=$v['jobnumber'];
}
unset($userJobnumberArray);
$userGruop = [];
foreach ($list as $k => $v) {
    foreach($v as $deptid){
        if(isset($ujba[$deptid]))
        $userGruop[$k][] = $ujba[$deptid];
    }
}

print_r($userGruop);
查看完整回答
反对 回复 2019-03-18
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

毕竟当数组非常大的时候,数组是将数据一次性加载到内存里,这样内存受不了,肯定会出现内存溢出这种问题。

怎么解决?

PHP手册中提供了一种 yield 方法

yield 返回的是依次输出这些值的一个迭代器。

这种方法的好处是在你处理大数据集合的时候不用一次性的加载到内存中

也就是说你甚至可以处理无限大的数据流。

快用上吧~

查看完整回答
反对 回复 2019-03-18
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

分批处理

每次处理1万条记录

总体耗时其实不比原来少,但是能减少内存开销

查看完整回答
反对 回复 2019-03-18
?
绝地无双

TA贡献1946条经验 获得超4个赞

简单的算了下,外面执行一千次循环,里面还要执行上万次遍历,这样肯定耗时很长,如果一开始就把外面的list数组变为字符串类型,然后对里面那个循环遍历的时候判断是不是在这个字符串里面会不会好点。【没尝试过,也不敢说一定好。】

查看完整回答
反对 回复 2019-03-18
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

如果这两个数组都来自数据库的话,我建议你优化下表结构;
如果表结构很难优化,那就先优化下两个数组,然后在匹配吧,毕竟键值匹配比in_array快一些;

查看完整回答
反对 回复 2019-03-18
?
慕容3067478

TA贡献1773条经验 获得超3个赞

$userJobnumberArray 这个为什么不变成map的形式[deptid => jobnumber]?

查看完整回答
反对 回复 2019-03-18
?
慕的地10843

TA贡献1785条经验 获得超8个赞

先拿$list,去重整理成字符串,作为取$userJobnumberArray 的in 条件。几千个没什么压力吧。。。

查看完整回答
反对 回复 2019-03-18
  • 8 回答
  • 0 关注
  • 401 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信