PHP性能优化:in_array和isset 在大数组查询中耗时相差巨大,以及巧妙使用array_flip...

本文介绍了一种在PHP中优化大型数组查找的方法。通过使用array_flip()将数组转换为键值形式,结合array_key_exists()或isset()进行快速查找,显著提高了处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  今天在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])){
        //
    }
}

  速度瞬间起来了~

 

  来一段测试代码:

<?php

set_time_limit(0);

$arr = range(1, 100000);
$arr1 = array_flip($arr);

$len = count($arr);

$j = 5000;

// array_key_exists
$begin = time();
for($i = 0; $i < $len; $i++){
    if(array_key_exists($j, $arr1)){
    }
}
echo "array_key_exists:".(time() - $begin)."\r\n";


// isset
$begin = time();
for($i = 0; $i < $len; $i++){
    if(isset($arr1[$j])){
    }
}
echo "isset:".(time() - $begin)."\r\n";


// in_array
$begin = time();
for($i = 0; $i < $len; $i++){
    if(in_array($j, $arr)){
    }
}
echo "in_array:".(time() - $begin)."\r\n";


/**
 *
    array_key_exists:0
    isset:0
    in_array:17
 */

 

再贴个真实业务上对比:

一个4s,一个1746s

 

转载于:https://www.cnblogs.com/firstForEver/p/7263348.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值