時系列の次の番号を見つける必要があります。たとえば、私は配列を持っています:
$numbers = array(1,2,4);
関数が不足している年代番号を教えてほしい:3
より多くの例:
$numbers = array(6,7,8,11);
私に与える必要があります:9
ありがとう
これを行う唯一の方法は、配列で使用sort
してから、配列全体をループすることです。
配列内の指定された位置に数値を挿入するには、this を見てください。
ただし、nickbの回答を使用してください-はるかに優れています!
配列が次のようにソートされていると仮定すると、解決策は簡単です。
sort( $numbers);
次に、数値の完全な範囲を取得し、完全なセットと入力配列で差を付けて、最初の要素 (異なる最初の要素になります) を取得できます。
配列はソートされているため、次のように最小要素と最大要素を取得できます ( min()
andを呼び出すこともできますmax()
)。
$min = current( $numbers);
$max = end( $numbers);
ここで、 を使用range()
して数値の完全なセットを取得し、 を呼び出しarray_diff()
て違いを見つけます。
$complete = range( $min, $max);
$diff = array_diff( $complete, $numbers);
最初の連続欠落数は、違いの最初の要素にあります。
$first_missing = array_shift( $diff);
ここでの利点は、 から までの範囲の欠損値がすべて$diff
含まれることです。$min
$max
これでうまくいくはずです:
<?php
function chrono_trigger($array) {
sort($array, SORT_NUMERIC);
$prev = False;
foreach($array as $num) {
if($prev === False) {
$prev = $num;
continue;
}
if($prev != ($num-1)) {
return $prev+1;
}
$prev = $num;
}
return False;
}
$numbers1 = array(1,2,4); // Should return 3
$numbers2 = array(6,7,8,11); // Should return 9
$numbers3 = array(1,2,3,4); // Shouldn't return anything
// Returns 3
$missing1 = chrono_trigger($numbers1);
var_export($missing1);
// Returns 9
$missing2 = chrono_trigger($numbers2);
var_export($missing2);
// Returns False
$missing3 = chrono_trigger($numbers3);
var_export($missing3);