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

如何在PHP中检测可用的数组插槽?,php,arrays,math,Php,Arrays,Math,这是一个奇怪的问题,因为我不知道该怎么称呼它!我有一个带有数字列表的数组。这些数字是自动检测到的,所以我无法设置它们 数字的范围包括“001、002、003、004、005、006”或“001、003、004”。 请注意,在第一个数字列表中,它们都向上排列(1,2,3,4,5,6),但在第二个列表中,它们的顺序较低(1,3,4) 我的复杂问题是:如何检测第一个可用的数组条目?对于第一个,我想要“007”,对于第二个,我想要“002”。我究竟如何检测到这一点并添加一个数组元素来填充插槽 系统支持无

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

数字的范围包括“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);
$currentunits=数组(“001”、“003”、“004”、“006”);
$currentunits=array_diff($currentunits,range(“001”、“999”));
回声“;
打印(当前单位);

提前谢谢,希望我没有把你弄糊涂

如果数组不是很大,我可能会检测数组中最小和最大的元素,创建一个包含完整范围的数组,然后将其与原始数组进行比较

int(2)
结果

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"
例如:

如果数组不是很大,我可能会检测数组中最小和最大的元素,创建一个包含完整范围的数组,然后将其与原始数组进行比较

int(2)
结果

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"
例如:

假设您的001是字符串
“001”
,而不是数字
1
(等):


假设您的001是字符串
“001”
,而不是数字
1
(etc):



你可以用一个包含所有插槽的数组
array\u diff
。我试过在其中循环,如果数字不在原始列表中,则添加数字,但没有效果。然后我感到困惑,决定问那些更可能知道的人!你是说数组中的插槽
1,2,3,4
,你想首先从这些插槽中检测ASC或DSC中的哪个插槽是免费的
吗?你应该发布不起作用的代码。@softgenic是的,基本上是这样的。如果我输入一个数组“1”、“2”、“3”、“4”、“6”,我还希望得到一个“5”的响应。你可以用一个包含所有插槽的数组
array_diff
。我尝试过循环遍历它,如果它们不在原始列表中,则添加数字,但它不起作用。然后我感到困惑,决定问那些更可能知道的人!你是说数组中的插槽
1,2,3,4
,你想首先从这些插槽中检测ASC或DSC中的哪个插槽是免费的
吗?你应该发布不起作用的代码。@softgenic是的,基本上是这样的。如果我输入一个数组“1”、“2”、“3”、“4”、“6”,我还希望得到一个“5”的响应。我使用了range($min,“999”)并跳过了整个if语句位,但除此之外,这是完美的!谢谢嗯,我不知道有一个上限,当没有差异时需要
if
,如果数组已满,则可能需要另一个if。嗯,我使用了range($min,“999”)并跳过了整个if语句位,但除此之外,这是完美的!谢谢嗯,我不知道有一个上限,如果不存在差异,则需要
,如果数组已满,则可能需要另一个if。这是回答问题的最佳解决方案(使用字符串而不是整数)@Leigh是的,如果OP使用了您答案中的整数,他/她所要做的就是切换
array\u diff
的参数。但是,OP的解决方案失败了,因为使用的插槽是以字符串形式给出的,
range
返回一个充满整数的数组。@jeroen这个答案已经像5-6x一样编辑过了,并讨论了我的评论;)@利:5-6倍?这就是所谓的夸张:)是的,我同意。我现在换成了这个!这是回答问题的最佳解决方案(使用字符串而不是整数)@Leigh的确如此,如果OP使用了与您的答案类似的整数,他/她所要做的就是切换
数组的参数。但是,OP的解决方案失败了,因为使用的插槽是以字符串形式给出的,
range
返回一个充满整数的数组。@jeroen这个答案已经像5-6x一样编辑过了,并讨论了我的评论;)@利:5-6倍?这就是所谓的夸张:)是的,我同意。我现在换成了这个!