假设您有一个数组“value => timestamp”。这些值随着时间的推移而增加,但它们可以随时重置。
例如:
$array = array(
1 => 6000,
2 => 7000,
3 => 8000,
7 => 9000,
8 => 10000,
9 => 11000,
55 => 1000,
56 => 2000,
57 => 3000,
59 => 4000,
60 => 5000,
);
我想从这个数组中检索所有缺失的值。
此示例将返回:
array(4,5,6,58)
我不希望9到55之间的所有值都是因为9比其他更高的值更新。
在实际情况下,脚本将处理数千个值,因此需要高效。
感谢您的帮助!
更新: 如果算法更容易,则可以按时间戳对初始数组进行排序。
更新2: 在我的示例中,值是UNIX时间戳,因此它们看起来更像是:1285242603但出于可读性原因我简化了它。
答案 0 :(得分:4)
这是另一种解决方案:
$prev = null;
$missing = array();
foreach ($array as $curr => $value) {
if (!is_null($prev)) {
if ($curr > $prev+1 && $value > $array[$prev]) {
$missing = array_merge($missing, range($prev+1, $curr-1));
}
}
$prev = $curr;
}
答案 1 :(得分:1)
您可以执行以下操作:
以代码翻译:
$array = array( 1 => 6000, 2 => 7000, 3 => 8000, 7 => 9000, 8 => 10000,
9 => 11000,55 => 1000, 56 => 2000, 57 => 3000, 59 => 4000,
60 => 5000,);
$keys = array_keys($array);
for($i=0;$i<count($array)-1;$i++) {
if($array[$keys[$i]] < $array[$keys[$i+1]] && ($keys[$i+1]-$keys[$i] != 1) ) {
print(implode(' ',range($keys[$i]+1,$keys[$i+1]-1)));
print "\n";
}
}
答案 2 :(得分:1)
这会得到所需的结果array(4,5,6,58)
:
$previous_value = NULL;
$temp_store = array();
$missing = array();
$keys = array_keys($array);
for($i = min($keys); $i <= max($keys); $i++)
{
if(!array_key_exists($i, $array))
{
$temp_store[] = $i;
}
else
{
if($previous_value < $array[$i])
{
$missing = array_merge($missing, $temp_store);
}
$temp_store = array();
$previous_value = $array[$i];
}
}
var_dump($missing);
或者只使用Gumbo非常智能的解决方案; - )