php - 使用大型索引数组过滤大型多维数组的最优化方法
问题描述
我的两个数组都有超过 500 000 个元素。
我想只返回索引数组中不存在的多维数组中的那些元素。
这是我的多维数组的样子:
$new_codes = [
0 => [
'id' => 1,
'code' => 'code1',
... another values
],
1 => [
'id' => 2,
'code' => 'code2',
... another values
],
2 => [
'id' => 3,
'code' => 'code3',
... another values
]
];
另一个数组只是带有代码值的普通索引数组:
$old_codes = [
'code1',
'code2',
];
对于这个有限的示例,过滤后,$new_codes 应该只有索引2,因为 $old_codes 数组中不存在该值。
我试过使用下面的代码,但由于数组太大,操作需要很长时间,以至于我以为我以某种方式创建了无限循环,但似乎检查另一个数组中是否存在超过 500000 个元素的值有超过一百万个元素需要很长时间。
// option 1
$new = array_filter($new_codes, function ($var) use ($old_codes) {
return !in_array($var['code'], $old_codes);
});
// option 2
$filtered = [];
foreach($new_codes as $code) {
if(in_array($code['code']){
continue;
}
$filtered[] = $code;
}
欢迎任何有关更优化解决方案的建议。
提前致谢。
解决方案
阅读这个问题我意识到使用 isset() 是处理如此大量元素的更好选择,所以我这样做了:
// switch array keys and values
$old_array = array_flip($old_array);
foreach($new_codes as $code) {
if(isset($old_array[$code['code']])){
continue;
}
$filtered[] = $code;
}
这样做将时间缩短到几秒钟。
推荐阅读
- token - 错误:返回错误:处理事务时出现 VM 异常:恢复 SafeERC20:低级调用失败
- python - 无法理解 Python 电报机器人作业队列
- python - Python openCV 在复杂图像上查找轮廓
- docker - 无法在清漆 6.5.1 中使用 std vmod
- postscript - 使用 postscript 'clip' 命令打印文档中的多个字段的正确技术是什么?
- apache-kafka-streams - spring-cloud-stream、kafka 和 avro 的问题侦探
- node.js - Beanstalk Cloudwatch 日志的换行问题
- python - 使用 itertools 从某个点继续排列
- java - JAVA Socket:服务器一直在监听客户端的文件请求
- discord - 不和谐机器人从语音频道收听和转录文本的方式