我需要找到按时间顺序排列的下一个数字。例如,我有一个数组:
$numbers = array(1,2,4);
我想要函数给我缺少的按时间顺序排列的数字:3
更多示例:
$numbers = array(6,7,8,11);
需要给我:9
谢谢
The only way I see doing this is to use sort
on your array, then looping through the entire array.
To insert the number at the specified position in the array, look at this.
Use nickb's answer though - much better!
一旦您假设数组按以下方式排序,解决方案就很简单:
sort( $numbers);
然后,您可以获得完整的数字范围,对完整集和输入数组进行差异,并获取第一个元素(这将是第一个不同的元素):
由于数组已排序,我们可以像这样获取最小和最大元素(我们也可以调用min()
and max()
):
$min = current( $numbers);
$max = end( $numbers);
现在,我们使用range()
获取完整的数字集,然后调用array_diff()
查找差异:
$complete = range( $min, $max);
$diff = array_diff( $complete, $numbers);
第一个连续缺失的数字在差的第一个元素中:
$first_missing = array_shift( $diff);
这里的好处是$diff
它将包含和范围之间的所有缺失数字。$min
$max
这应该可以解决问题:
<?php
function chrono_trigger($array) {
sort($array, SORT_NUMERIC);
$prev = False;
foreach($array as $num) {
if($prev === False) {
$prev = $num;
continue;
}
if($prev != ($num-1)) {
return $prev+1;
}
$prev = $num;
}
return False;
}
$numbers1 = array(1,2,4); // Should return 3
$numbers2 = array(6,7,8,11); // Should return 9
$numbers3 = array(1,2,3,4); // Shouldn't return anything
// Returns 3
$missing1 = chrono_trigger($numbers1);
var_export($missing1);
// Returns 9
$missing2 = chrono_trigger($numbers2);
var_export($missing2);
// Returns False
$missing3 = chrono_trigger($numbers3);
var_export($missing3);