PHP中 in_array 、array_key_exists 和 isset 执行速度比较

数组是PHP的一个大杀器. 如何判断一个大数组中是否存在某一个值, 需要考虑性能问题. 对于小的数组, 我们可以直接使用 in_array, 那么大点的数组就需要使用array_flip反转键值对, 然后使用 array_key_exists或者isset了.

测试环境: win10 + PHP 7.2.0 (Cli)

先准备一个10w的数组, 以及一个要查找的值, 然后循环查找1w次, 记录时间.

这里我们用短md5的方式生成数组的值)

function md5short($id) {
    return substr(md5($id), 8, 16);
}

//一个10w的数组
$arrLarge = [];
for ($i = 0; $i < 100000; $i++) {
    $arrLarge[$i] = md5short($i);
}
//要查找的值
$needle = md5short(99998); //682d83a41d25acb6

in_array 的测试代码:

//in_array 用时计算
$timeStart = microtime(true);
for ($i = 0; $i < 10000; $i++) {
    $rt = in_array($needle, $arrLarge);
}
$timeEnd = microtime(true);
$timeElapsed = round($timeEnd - $timeStart, 6) * 1000;
echo 'in_array 1000次用时 ' . $timeElapsed . ' ms' . PHP_EOL . PHP_EOL;

array_key_exits的测试代码:

//array_key_exists 用时计算
//交换键和值
$timeStart = microtime(true);
$arrLargeFlipped = array_flip($arrLarge);
$timeEnd = microtime(true);
$timeElapsed = round($timeEnd - $timeStart, 6) * 1000;
echo '交换键和值一次 用时 ' . $timeElapsed . ' ms' . PHP_EOL;
$timeStart = microtime(true);
for ($i = 0; $i < 10000; $i++) {
    $rt = array_key_exists($needle, $arrLarge);
}
$timeEnd = microtime(true);
$timeElapsed = round($timeEnd - $timeStart, 6) * 1000;
echo 'array_key_exists 1000次用时 ' . $timeElapsed . ' ms' . PHP_EOL;

isset的测试代码:

//isset 用时计算
//交换键和值
$timeStart = microtime(true);
$arrLargeFlipped2 = array_flip($arrLarge);
$timeEnd = microtime(true);
$timeElapsed = round($timeEnd - $timeStart, 6) * 1000;
echo '交换键和值一次 用时 ' . $timeElapsed . ' ms' . PHP_EOL;
$timeStart = microtime(true);
for ($i = 0; $i < 10000; $i++) {
    $rt = isset($arrLarge[$needle]);
}
$timeEnd = microtime(true);
$timeElapsed = round($timeEnd - $timeStart, 6) * 1000;
echo 'isset 1000次用时 ' . $timeElapsed . ' ms' . PHP_EOL;

测试结果1:

in_array 1000次用时 17763.025 ms
交换键和值一次 用时 5.54 ms
array_key_exists 1000次用时 0.52 ms
交换键和值一次 用时 3.746 ms
isset 1000次用时 0.357 ms

测试结果2:

in_array 1000次用时 17495.181 ms
交换键和值一次 用时 4.871 ms
array_key_exists 1000次用时 0.543 ms
交换键和值一次 用时 3.956 ms
isset 1000次用时 0.41 ms

有结果可知, 在大数组的情况下, in_array的速很慢, 不考虑键值互换消耗的时间, array_key_exists和isset的速速是极快的.

三者的性能关系:

isset > array_key_exists >> in_array

### 回答1: array_key_exists 函数用于检查指定的键名是否存在于指定的数组。它的语法如下: bool array_key_exists ( mixed $key , array $array ) 其,$key 是要检查的键名,$array 是要检查的数组。 如果给定的 $key 在 $array 存在,则该函数返回 true,否则返回 false。 举个例子: $arr = array('a' => 1, 'b' => 2, 'c' => 3); if (array_key_exists('a', $arr)) { echo '存在'; } else { echo '不存在'; } // 输出 "存在" 注意:该函数只能检查数字键名和字符串键名,不能检查其他类型的键名,例如对象。 ### 回答2: array_key_exists是一个用于检查数组是否存在指定键名的函数。它的语法是array_key_exists(key, array),其key表示要检查的键名,array表示要检查的数组。 当给定的键名存在于数组时,函数返回true;否则返回false。这个函数在判断一个数组是否包含某个键名的时候非常实用。 使用array_key_exists函数可以避免在检查数组键名之前,使用isset函数进行判断,因为在数组键名存在但其值为null的情况下,isset函数会返回false,而array_key_exists函数会返回true。 下面是一个使用array_key_exists函数的例子: ```php $fruits = array("apple" => "red", "banana" => "yellow", "orange" => "orange"); if (array_key_exists("apple", $fruits)) { echo "数组存在键名为apple的元素"; } else { echo "数组不存在键名为apple的元素"; } ``` 在上面的例子,我们定义了一个水果数组$fruits,并使用array_key_exists函数检查数组是否存在键名为"apple"的元素。由于该键名存在,所以函数返回true,最终输出"数组存在键名为apple的元素"。 总的来说,array_key_exists函数是用于检查数组是否存在指定键名的便捷函数,可以帮助我们在处理数组时进行必要的判断和逻辑处理。 ### 回答3: array_key_exists是一个用于检查数组是否存在指定键名的函数。它接受两个参数,第一个参数是要检查的键名,第二个参数是要检查的数组。 当数组存在指定的键名时,array_key_exists返回true;否则,返回false。与in_array不同的是,array_key_exists只检查数组的键名,而不检查键值。 这个函数的作用在于帮助我们确定数组是否存在特定的键名,特别是当我们不确定数组是否包含某个键名时,可以使用它来进行判断。 下面是一个使用array_key_exists的示例: ```php $fruits = array("apple" => "苹果", "banana" => "香蕉", "orange" => "橙子"); if (array_key_exists("banana", $fruits)) { echo "数组存在键名'banana'。"; } else { echo "数组不存在键名'banana'。"; } ``` 上述代码,我们首先创建了一个包含苹果、香蕉和橙子的水果数组。然后,使用array_key_exists函数来检查数组是否存在键名'banana'。由于数组包含这个键名,因此函数返回true,并输出"数组存在键名'banana'"。 总之,array_key_exists是一个用于检查数组是否存在指定键名的函数,可以帮助我们确定数组是否包含某个键名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值