【问题标题】:How to find missing values in a sequence with PHP?如何使用 PHP 查找序列中的缺失值?
【发布时间】:2010-09-23 11:26:43
【问题描述】:

假设您有一个数组“值 => 时间戳”。这些值随着时间的推移而增加,但可以随时重置。

例如:

$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 但出于可读性原因,我对其进行了简化。

【问题讨论】:

  • 这很容易做到……你试过了吗?如果是这样,你在哪里失败了?
  • 10, 11, ..., 53, 54 怎么样?
  • 您需要对其进行迭代并在到达每个元素时应用您的条件。似乎是一个奇怪的要求。
  • 如果您能详细说明为什么需要这种类型的功能,那么它将帮助其他人引导您朝着正确的方向前进。

标签: php algorithm find


【解决方案1】:

这是另一个解决方案:

$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;
}

【讨论】:

    【解决方案2】:

    您可以执行以下操作:

    • 继续比较相邻的数组键。如果 他们是连续的,你什么都不做。
    • 如果它们不是连续的,那么你 检查它们的值,如果值有 从较高的值下降到 较低的值,这意味着有一个 重置,所以你什么都不做。
    • 如果值没有下降,那么它 是缺少键的情况。所有 两个键之间的数字(极端 不包括在内)是结果的一部分。

    代码翻译:

    $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

    【讨论】:

    • 感谢 ideone.com ,我不知道这个网站!
    【解决方案3】:

    这给出了想要的结果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 非常聪明的解决方案 ;-)

    【讨论】:

    • 如果最小值和最大值之间的差距非常大,这个解决方案似乎很慢。这可能发生在我的情况下。但是谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    相关资源
    最近更新 更多