据说 PHP in_array 大数据量下很慢,如何优化?老头找到几篇教程,记录过来了,有需要参考一下。
PHP 高效率 数组查找 - 替换 in_array
来源:wintop
作者在处理一个 1000 多个元素数组,用 PHP in_array 计算,效率很差,循环 100 万次要几十秒。同时用 array_flip 反转函数,判断数组 key,通过 100 万次运算,效果不好,也是几十秒;也有用 implode 拼接成字符串,然后 stripos 查出位置,返回是否包含,效率也是很差,几十秒。
下面是作者写的方法,可替换 PHP in_array ,效率提升上百倍:
function inArray(string $str,array $strArray){
foreach($strArray as $v){
if(str_replace($v,$str,'')=='' && strlen($v)==strlen($v)){
return true;
}
}
return false;
}
in_array 数组 优化思考
结论:
- 如果明确数据类型,in_array 第三个参数建议一直开启;
- 如果搜索单一字符串,基数 100 以内,可以选择 isset(array_flip()), 基数在 100 以上,则选择 in_array() 更好;
- 如果是搜索数组,选择 isset(array_flip()) 会更好。
PHP 性能优化:in_array 和 isset 在大数组查询中耗时相差巨大,以及巧妙使用 array_flip
作者在 PHP 业务开发中,发现一个问题:两个较大数组(20万+元素),遍历其中一个 $a,另一个数组 $b 用于查找元素,速度非常之慢,加上业务处理,耗时快半个小时之久。
比如:
foreach($a as $val){
if(in_array($xx, $b)){
//
}
}
排查后发现 in_array() 速度很慢。怎么样优化呢?在 PHP 数组中,如果用 in_array 或者 array_search 这种寻找数组 value值,PHP 会整个遍历一遍查询,这样当数组很大时,当然会很慢。
而考虑使用 array_key_exists 或者 语言构造器 isset 则会很快。但是这两个用法需要 value 是 key 才行,非常幸运,PHP 是世界上最好的语言。array_flip() 提供这个用法。
优化代码,速度瞬间起飞:
$c = array_flip($b);
foreach($a as $val){
if(isset($c[$xx])){
//
}
}
Comments:0