2010-03-11 35 views
3

给定一个数组是这样的:从阵列中找到第一个可用的ID

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

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

我可以使用一些while循环或使用临时变量进行排序,但这有点麻烦,所以我很想看看有没有人能想出一个'聪明'的解决方案。

回答

6

我的PHP技能是有点生疏,但不能使用rangearray_diff

$missing = array_diff(range(1, end($myArray)+ 1), $myArray); 
echo $missing[0]; 

更新与大肚Ulmanen的修正(我告诉过你我的PHP是生锈;-))

+1

+1这是我原本想给出的那种答案,虽然不知道“范围”,但自己创建序列阵列确实很麻烦。但是,您可能必须使用'array_keys($ myArray)'作为第一个参数,并考虑数组中没有孔的可能性。 – middus 2010-03-11 11:04:17

+1

这只是我正在寻找的解决方案。这应该使用一个更正:'end($ myArray)'而不是'count($ myArray)',因为count可能小于数组中的最大值。 – 2010-03-11 11:05:48

+0

@Tatu:好点,修正:-) – 2010-03-11 11:09:12

0

如果阵列只使用数字键和无孔,你可以做$next_id = count($your_array)

如果有孔,您可以同时尝试

$keys = array_keys($your_array); 
rsort($keys); 
$next_id = empty($keys)?0:($keys[0]+1); 
+1

rsort返回一个布尔值,不是吗? – middus 2010-03-11 10:51:25

+0

正确修正:) – Mathieu 2010-03-11 11:16:16

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}"; 
1

我不相信这是比一些回路较少凌乱,但在这里不用我人为的例子:

sort($array); 
$range = range(reset($array), end($array)); 
$diff = array_diff($range, $array); 
$result = null != ($result = array_shift($diff)) ? $result : end($array) + 1; 
+0

不能相信你打我31秒,我知道我不应该打扰拿到链接哈哈。 – 2010-03-11 11:02:24

+0

哈哈,我知道这种感觉,但一切都很好。 ;-)然而,你有点清洁。尽管严格的标准不允许你像这样将参数传递给'array_diff'。 – 2010-03-11 11:04:59

+0

正如我在我的回答中所说的,我的PHP技能有点生疏,所以我对严格的标准做的不多。我可能每隔几个月写一些PHP一次左右:-) – 2010-03-11 11:10:18

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())也会慢很多。

相关问题