代码如下:$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);
qq_花开花谢_0
TA贡献1835条经验 获得超7个赞
毕竟当数组非常大的时候,数组是将数据一次性加载到内存里,这样内存受不了,肯定会出现内存溢出这种问题。
怎么解决?
PHP手册中提供了一种 yield
方法
yield
返回的是依次输出这些值的一个迭代器。
这种方法的好处是在你处理大数据集合的时候不用一次性的加载到内存中
也就是说你甚至可以处理无限大的数据流。
快用上吧~
绝地无双
TA贡献1946条经验 获得超4个赞
简单的算了下,外面执行一千次循环,里面还要执行上万次遍历,这样肯定耗时很长,如果一开始就把外面的list数组变为字符串类型,然后对里面那个循环遍历的时候判断是不是在这个字符串里面会不会好点。【没尝试过,也不敢说一定好。】
- 8 回答
- 0 关注
- 401 浏览
添加回答
举报
0/150
提交
取消