0

这是一个奇怪的问题,因为我不知道该怎么称呼它!我有一个带有数字列表的数组。这些数字是自动检测的,所以我无法设置它们。

这些数字的范围为“ 001、002、003、004、005、006 ”或“ 001、003、004 ”。 请注意,在第一个数字列表中,它们都上升 (1,2,3,4,5,6),但在第二个数字列表中,它们的顺序较低 (1, 3, 4)。

我的复杂问题是:如何检测第一个可用的数组条目?对于第一个,我想要“ 007 ”和第二个“ 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 回答