【发布时间】:2011-05-29 22:31:08
【问题描述】:
我有一个很大的 while 循环函数,每次加载它以检查当前的 URL 名称。
所以我需要知道在 while 循环中检查大数组中的 URL 名称哪个更好,
in_array() 或 array_search() 函数。
【问题讨论】:
我有一个很大的 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 年 1 月 2 日更新:添加了 noop 循环以“将比例归零”。在新的 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 ms : array_search 22.345 ms : in_array 4.895 ms :isset
$needle 初始化以及所需函数的时间。该结果肯定无法显示in_array 和array_search 之间的区别。
$needle 分配,差异的比例将减少。我认为分配速度足够快,不会对结果产生太大影响。你测试过这个假设吗?
根据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
【讨论】:
如果您的唯一目标是检查数组中是否存在 URL,我会选择 in_array。尽管最好的方法是设置键,这样您就可以通过数组键进行搜索。这样可以节省大量循环。
$searchword = "test";
echo $array[$searchword];
【讨论】:
这取决于您的数组大小。 - 如果你有一个小数组(比如
-通过大数组(如 > 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 返回真假值,array_search 返回数组的键
【讨论】: