php内置的三个数组函数来查找指定值是否存在于数组中,这三个数组分别是
in_array()
,array_search()
,array_key_exists()
。
in_array(value,array,type)
该函数的作用是在数组array中搜索指定的value值,type是可选参数,如果设置该参数为 true ,则检查搜索的数据与数组的值的类型是否相同,即恒等于。
<?php
$people = array("Peter", "Joe", "Glenn", "Cleveland");
if(in_array("Glenn",$people)){
echo "Match found";
}else{
echo "Match not found";
}
array_key_exists(key,array)
该函数是判断某个数组array中是否存在指定的 key,如果该 key 存在,则返回 true,否则返回 false。
<?php
$a=array("a"=>"Dog","b"=>"Cat");
if(array_key_exists("a",$a)){
echo "Key exists!";
}else{
echo "Key does not exist!";
}
array_search(value,array,strict)
array_search()
函数与 in_array()
一样,在数组中查找一个键值。如果找到了该值,则返回匹配该元素所对应的键名。如果没找到,则返回 false。注意在 PHP 4.2.0 之前,函数在失败时返回 null 而不是 false。同样如果第三个参数 strict 被指定为 true,则只有在数据类型和值都一致时才返回相应元素的键名。
<?php
$a=array("a"=>"Dog","b"=>"Cat","c"=>5,"d"=>"5");
echo array_search("Dog",$a);
echo array_search("5",$a);
重点
$array = ['a', 'b', 'c'];
var_dump(in_array(0, $array)); // 返回bool(true),也就相当于数组中有0
var_dump(in_array(0, $array, true)); // 返回bool(false),也就相当于数组中无0
var_dump(array_search(0, $array)); // 返回int(0),也就是第一个值的下标
var_dump(array_search(0, $array, true)); // 返回false
在比较前,PHP强制转换了类型
在PHP中,当string的类型的数据和int类型的数据进行对比的时候,会强制把string转换为int,而如果string的类型数据第一个数字,就会被转换为0。
总结
所以需要用 in_array()
或者是 array_search()
的时候,尽量把第三个参数设置为true,另外呢,如果设置第三个参数为true的话,那么在查找的时候,会直接对比类型和值,避免了PHP的自动转换类型,性能会快很多。不过呢,数组查询呢,还是尽量使用isset函数或者是array_key_exists函数来代替。
流言终结者
采用 array_flip()
翻转后,用 isset()
代替 in_array()
函数,用 $array[key]
替代 array_search, 这样能解决大数组超时耗时问题?
<?php
$array = array();
for ($i=0; $i<2000000; $i++){
##随机字符串
$array[$i] = 'test'.$i;
}
$str = $array[150000];
$time1 = microtime(true);
array_search($str, $array,true);
$time2 = microtime(true);
echo '原始方法:'.($time2-$time1)."\n";
$time3 = microtime(true);
$new_array = array_flip($array);
isset($new_array[$str]);
$time4 = microtime(true);
echo '新方法:'.($time4-$time3);
运行结果
原始方法:0.0017399787902832
新方法:0.055043935775757