给出这样的数组:
Array => (
[0] => 1,
[1] => 2,
[2] => 3,
[3] => 5,
[4] => 6
)
在该数组中找到第一个“可用”ID的最简单方法是什么 - 也就是说,数组中不存在序列[1,2,3...n]
中的第一个值?在这种情况下,正确的答案是4
。
我可以使用一些while循环或使用临时变量排序,但这有点混乱,所以我很想知道是否有人能想出一个'聪明'的解决方案。
答案 0 :(得分:6)
我的PHP技能有点生疏,但您无法使用range
和array_diff
:
$missing = array_diff(range(1, end($myArray)+ 1), $myArray);
echo $missing[0];
更新了Tatu Ulmanen的更正(我告诉你我的PHP生锈了; - ))
答案 1 :(得分:1)
除了对数组进行排序并通过它寻找漏洞之外,我无法想到任何事情。
可能是这样的:
sort($array);
$next_available = array_shift($array);
foreach($array as $_k) {
++$next_available;
if($_k > $next_available) {
break;
}
}
echo "Next available index: {$next_available}";
答案 2 :(得分:1)
我不相信这比一些循环更简洁,但这是我设计的例子:
sort( $array );
$range = range( reset( $array ), end( $array ) );
$diff = array_diff( $range, $array );
$result = null != ( $result = array_shift( $diff ) ) ? $result : end( $array ) + 1;
答案 3 :(得分:1)
这有点神奇,但有诀窍:
$values = array_values($id_array);
$values[] = max($values) + 1;
$combined = array_values(array_flip($values) + array_keys($values));
$missing = isset($combined[count($values) + 1])
? $combined[count($values) + 1]
: end($values);
这样做的好处是速度相当快。使用range()
的问题是,小数组中的单个大键会使array_diff()
非常慢。此外,如果ID中没有间隙,则会返回下一个键(或者您可以将最终end($values)
更改为false
,如果这是您想要的那样)。
尽管聪明,但它仍然比简单地遍历数组慢。但是array_diff()
(即使没有range()
)也会慢得多。
答案 4 :(得分:0)
如果您的数组仅使用数字键且没有孔,则可以执行$next_id = count($your_array)
如果有洞,你可以尝试
$keys = array_keys($your_array);
rsort($keys);
$next_id = empty($keys)?0:($keys[0]+1);