对不起,但是AFAIK你真的必须循环这个低谷。
如果数组是有序的,你可以找到第一个更高的索引,然后添加剩余的索引。
编辑:这是我用来基准测试的代码:
set_time_limit(0);
$a = array(0,0,50,100,200,400,800);
$a = array_merge(range(0, 100000), $a);
sort(a); // we need this since array_merge will not maintain the sequence
$result = array
(
'testWithForeach' => 0,
'testWithArrayFlip' => 0,
'testWithArraySearch' => 0,
);
foreach (range(0, 1000, 10) as $n) // search values $n to try
{
for ($i = 0; $i < 10; ++$i) // how many times to run each test
{
foreach (array_keys($result) as $test) // divide the CPU usage fairly (inner-most loop)
{
$start = microtime(true); call_user_func($test, $a, $n); $result[$test] += (microtime(true) - $start);
}
}
}
asort($result);
echo '<pre>';
print_r($result);
echo '</pre>';
function testWithForeach($a, $n)
{
foreach ($a as $key => $value)
{
if ($value >= $n)
{
$result = $key; break;
}
}
return $result;
}
function testWithArrayFlip($a, $n)
{
$a[] = $n; sort($a); $a = array_flip($a); return ($a[$n] - 1);
}
function testWithArraySearch($a, $n)
{
$a[] = $n; sort($a); return (array_search($n, $a) - 1);
}
所有方法都在相似的条件下运行,并且分布在 CPU 时间上。
我测试了$n
从 0 到 1000 的所有值,使用 10 作为步长(总共 100)。
每个$n
/ 方法组合运行了 10 次,我得到的结果是:
Array
(
[testWithForeach] => 19.338931560516
[testWithArraySearch] => 96.209128856659
[testWithArrayFlip] => 133.85276961327
)
我尽量做到公平,实际运行时间可能会因$n
其他条件而异。