哪个是最好的array_search或in_array?

Thi*_*lak 36 php arrays

我有一个大的while循环函数,每次加载以检查当前的URL名称.所以我需要知道在while循环或函数中检查大数组中的URL名称 更好.in_array()array_search()

mar*_*rio 58

如果它是一个大型数组并且在一个循环中,那么它们都不是"最佳".而是array_flip()在您的阵列上使用,因此网址成为密钥.并isset()用来检查存在.

  • 为此,原始值必须是整数或字符串.虽然它适用于OP的问题,但它不能用作一般解决方案. (7认同)
  • 检查密钥是否存在比使用PHP要快得多.如果您需要经常引用一组大量唯一值,请始终将它们设置为键. (3认同)

Pat*_*her 52

这里没有真正的答案.所以我自己试了一下.

$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";
Run Code Online (Sandbox Code Playgroud)

对于典型的用例,in_array获胜,但差异可以忽略不计:

22.662 ms : array_search
22.104 ms : in_array
Run Code Online (Sandbox Code Playgroud)

更新2014-01-02:将noop循环添加到"零刻度".在新的MacBook pro上运行PHP 5.4.17,这是一个典型的结果:

24.462 ms : array_search
24.984 ms : in_array
Run Code Online (Sandbox Code Playgroud)

  • 给出一些基准的+1.我想通过指出@mario提供的array_flip/isset方法比array_search和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 (16认同)

eck*_*kes 40

基于的文件上in_arrayarray_search,我认为这主要取决于你想要的信息做什么:如果你需要进入,使用array_search,如果你只是想检查,如果阵列中存在的网址,in_array应该足够.

  • 取决于时间,哪个最好? (2认同)

小智 6

它是不同的函数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
Run Code Online (Sandbox Code Playgroud)