查找阵列中的第一个可用ID

时间:2010-03-11 10:36:51

标签: php arrays

给出这样的数组:

Array => (
  [0] => 1,
  [1] => 2,
  [2] => 3,
  [3] => 5,
  [4] => 6
)

在该数组中找到第一个“可用”ID的最简单方法是什么 - 也就是说,数组中不存在序列[1,2,3...n]中的第一个值?在这种情况下,正确的答案是4

我可以使用一些while循环或使用临时变量排序,但这有点混乱,所以我很想知道是否有人能想出一个'聪明'的解决方案。

5 个答案:

答案 0 :(得分:6)

我的PHP技能有点生疏,但您无法使用rangearray_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);