我有一个大的while循环函数,每次它被加载进行检查时都会使用当前的URL名称。因此,我需要知道在while循环中检查大型数组中的URL名称哪个更好,是in_array()
还是array_search()
函数。
array_flip()
,将 URL 变成键,并使用 isset()
来检查其是否存在。这里没有真正的答案。所以我自己试了一下。
$haystack = array
(
'apple',
'banana',
'cherry',
'lemon',
'lime',
'orange',
'potato',
'rutabaga'
);
$haySize = count($haystack);
$loops = isset( $_SERVER['argv'][1] ) ? $_SERVER['argv'][1] : 10000;
// echo 'Loops: ' . $loops . "\n";
$start = microtime(true);
for ($i = 0; $i < $loops; $i++)
{
$needle = $haystack[ $i % $haySize ];
}
$zeroTime = microtime(true) - $start;
// echo sprintf('%0.3f', $zeroTime * 1000) . ' ms : zero time' . "\n";
$start = microtime(true);
for ($i = 0; $i < $loops; $i++)
{
$needle = $haystack[ $i % $haySize ];
$dummy = array_search($needle, $haystack);
}
echo sprintf('%0.3f', (microtime(true) - $start - $zeroTime) * 1000) . ' ms : array_search' . "\n";
$start = microtime(true);
for ($i = 0; $i < $loops; $i++)
{
$needle = $haystack[ $i % $haySize ];
$dummy = in_array($needle, $haystack);
}
echo sprintf('%0.3f', (microtime(true) - $start - $zeroTime) * 1000) . ' ms : in_array' . "\n";
echo sprintf('%0.3f', (microtime(true) - $start) * 1000).' ms : in_array'."\n";
对于典型用例而言,使用in_array会更好,但两者的差异可以忽略不计:
22.662 ms : array_search
22.104 ms : in_array
更新于2014-01-02:在“归零刻度”中添加了一个空操作循环。 在新的MacBook Pro上运行PHP 5.4.17,这是一个典型的结果:
24.462 ms : array_search
24.984 ms : in_array
$flipped = array_flip($haystack); $start = microtime(true); for ($i=0; $i<$loops; $i++) { $needle = $haystack[$i % $haySize]; $dummy = isset($flipped[$needle]); } echo sprintf('%0.3f', (microtime(true) - $start) * 1000).' ms : isset'."\n";
25.281毫秒:array_search
22.345毫秒:in_array
4.895毫秒:isset - WildlyInaccurate$needle
的初始化以及所需函数的时间。这些结果绝对不能显示in_array
和array_search
之间的差异。 - Alexander Yancharuk$needle
赋值,差异比例将减少。我假设这个赋值足够快,对结果没有太大影响。您测试过这个假设吗? - Patrick Fisher根据 in_array 和 array_search 的文档,我认为这主要取决于您使用信息的目的:如果需要该条目,请使用 array_search
,如果只想检查URL是否存在于数组中,则 in_array
应该足够。
它们是不同的函数: in_array - 如果找到值则返回 true array_search - 如果找到值则返回位置
$a = array('a', 'b');
var_dump(in_array('a', $a)); // return true
var_dump(array_search('a', $a)); // return 0
if (array_search('a', $a)) - false
$searchword = "test";
echo $array[$searchword];
这取决于你的数组大小。 -如果你有一个小数组(比如<500k 32位键),in_array和array_search会给你相同的性能, isset(array[needle])没有意义,因为flip()的存在。
-对于大数组(比如>1m 32位键),in_array和isset(array[needle])之间有很大的差异。
array1=array("a"=>"one","b"=>"two");
if(in_array("one",$array))
{
echo "array exit";
}
else
{
echo " array not exist";
}
echo "</br>";
//example of array_search():
$b1=array("a"=>"one","b"=>"two");
echo array_search("one",$b1);
in_array 返回 true 和 false 值,而 array_search 返回数组的键