如何在PHP中检测可用的数组插槽?
这是一个奇怪的问题,因为我不知道该怎么称呼它!我有一个带有数字列表的数组。这些数字是自动检测到的,所以我无法设置它们 数字的范围包括“001、002、003、004、005、006”或“001、003、004”。 请注意,在第一个数字列表中,它们都向上排列(1,2,3,4,5,6),但在第二个列表中,它们的顺序较低(1,3,4) 我的复杂问题是:如何检测第一个可用的数组条目?对于第一个,我想要“007”,对于第二个,我想要“002”。我究竟如何检测到这一点并添加一个数组元素来填充插槽 系统支持无限的插槽,因此没有实际的插槽列表可供比较 以下是我目前的代码:如何在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”。我究竟如何检测到这一点并添加一个数组元素来填充插槽 系统支持无
$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倍?这就是所谓的夸张:)是的,我同意。我现在换成了这个!