如何使用PHP在序列中查找缺失值?

时间:2010-09-23 11:26:44

标签: php algorithm find

假设您有一个数组“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但出于可读性原因我简化了它。

3 个答案:

答案 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";
   }   
}

Working link

答案 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非常智能的解决方案; - )