0

何と呼べばいいのかわからないので、これは奇妙な質問です!数字のリストを含む配列があります。これらの番号は自動的に検出されるため、設定できません。

番号は、「 001、002、003、004、005、006」または「001、003、004 」のような範囲で提供されます。 番号の最初のリストでは、それらはすべて上昇しますが(1,2,3,4,5,6)、2番目のリストではそれらはあまり順序付けられていない(1、3、4)ことに注意してください。

私の複雑な質問はこれです:最初に利用可能な配列エントリを検出するにはどうすればよいですか?最初のものは「 007」、2番目のものは「002 」が欲しいです。一体どうやってこれを検出し、スロットを埋めるために配列要素を追加するのですか??!

システムは無制限のスロットをサポートしているため、比較するスロットの実際のリストはありません。

これまでの私のコードは次のとおりです。

$currentunits = array("001", "003", "004", "006");
$currentunits = array_diff($currentunits, range("001", "999"));
echo "<pre>";
print_r($currentunits);

よろしくお願いします。混乱していないことを願っています。

4

2 に答える 2

4

001が文字列"001"であり、数字1(など)ではないと仮定します。

function findNextSlot($array) {
    $counter = +$array[0];
    foreach ($array as $current) {
        if (sprintf("%03d", $counter) != $current) {
            return sprintf("%03d", $counter);
        }
        $counter++;
    }
    return sprintf("%03d", $counter);
}
echo findNextSlot(array("001", "002", "003", "004", "005", "006")); // "007"
echo findNextSlot(array("001", "003", "004")); // "002"
于 2012-12-08T19:34:20.617 に答える
1

配列が大きくない場合は、おそらく配列の最小要素と最大要素を検出し、全範囲を含む配列を作成してから、これを元の要素と比較します。

$array = [3,1,4];


sort($array);

$min = $array[0];
$max = end($array);

$comparison = range($min, $max);

$diff = array_diff($comparison, $array);

if ($diff) {
    var_dump(current($diff));
}
else {
    var_dump(count($array) + 1);
}

結果

int(2)

例: http ://codepad.viper-7.com/EIjI3I

于 2012-12-08T19:29:17.770 に答える