正直なところ、ループを使用したくない理由がわかりません。ループに問題はありません。それらは高速であり、それらなしでは済まされません。ただし、あなたの場合、PHP コア関数を使用して、独自のループを作成する必要を回避する方法があります。ただし、それらは配列をループしますが、それを避けることはできません。
とにかく、私はあなたが求めているものを集めます.3行で簡単に書くことができます:
function highestPlus(array $in)
{
$compare = range(min($in), max($in));
$diff = array_diff($compare, $in);
return empty($diff) ? max($in) +1 : $diff[0];
}
テスト済み:
echo highestPlus(range(0,11));//echoes 12
$arr = array(9,3,4,1,2,5);
echo highestPlus($arr);//echoes 6
そして今、恥知らずにペ・デ・レオンの答えを盗むために(しかし、あなたが望むことを正確に行うためにそれを「増強」してください):
function highestPlus(array $range)
{//an unreadable one-liner... horrid, so don't, but know that you can...
return min(array_diff(range(0, max($range)+1), $range)) ?: max($range) +1;
}
使い方:
$compare = range(min($in), max($in));//range(lowest value in array, highest value in array)
$diff = array_diff($compare, $in);//get all values present in $compare, that aren't in $in
return empty($diff) ? max($in) +1 : $diff[0];
//-------------------------------------------------
// read as:
if (empty($diff))
{//every number in min-max range was found in $in, return highest value +1
return max($in) + 1;
}
//there were numbers in min-max range, not present in $in, return first missing number:
return $diff[0];
それだけです、本当に。
もちろん、提供された配列に値または文字列が含まれていてnull
、値が重複している可能性がある場合は、入力を少し「クリーン」falsy
にすることが役立つ場合があります。
function highestPlus(array $in)
{
$clean = array_filter(
$in,
'is_numeric'//or even is_int
);
$compare = range(min($clean), max($clean));
$diff = array_diff($compare, $clean);//duplicates aren't an issue here
return empty($diff) ? max($clean) + 1; $diff[0];
}
便利なリンク: