0

時系列の次の番号を見つける必要があります。たとえば、私は配列を持っています:

$numbers = array(1,2,4);

関数が不足している年代番号を教えてほしい:3

より多くの例:

$numbers = array(6,7,8,11);

私に与える必要があります:9

ありがとう

4

3 に答える 3

2

これを行う唯一の方法は、配列で使用sortしてから、配列全体をループすることです。

配列内の指定された位置に数値を挿入するには、this を見てください

ただし、nickbの回答を使用してください-はるかに優れています!

于 2012-10-16T17:51:33.960 に答える
2

配列が次のようにソートされていると仮定すると、解決策は簡単です。

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

于 2012-10-16T17:56:39.557 に答える
1

これでうまくいくはずです:

<?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);
于 2012-10-16T17:59:09.130 に答える