如何在PHP中检测可用的数组插槽?

时间:2012-12-08 19:14:54

标签: php arrays math

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

数字的范围包括“ 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);

提前致谢,我希望我没有让你感到困惑!

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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