申し訳ありませんが、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
ステップとして10を使用して、0から1000までのすべての値をテストしました(合計100)。
各$n
/メソッドの組み合わせは10回実行され、得られた結果は次のとおりです。
Array
(
[testWithForeach] => 19.338931560516
[testWithArraySearch] => 96.209128856659
[testWithArrayFlip] => 133.85276961327
)
なるべく公平を期しておりますが、実際の走行時間は状況により変動する場合がござい$n
ます。