2010-09-23 75 views
2

假设你有一个数组“value => timestamp”。这些值随时间而增加,但可随时重置。如何使用PHP在序列中查找缺失值?

例如:

$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比其他更高的值更新。

在真实情况下,脚本将处理数千个值,因此它需要高效。

感谢您的帮助!


UPDATE: 初始阵列可以由时间戳来排序,如果它是用于该算法更容易。


更新2: 在我的例子中的值是UNIX时间戳,以他们看起来更像是这样的:1285242603但可读性原因,我简化它。

+0

这很容易做...你尝试过吗?如果是这样,你失败了? – 2010-09-23 11:28:30

+1

10,11,...,53,54呢? – Gumbo 2010-09-23 11:28:32

+0

您需要对它进行迭代,并在获取每个元素时应用您的条件。似乎有一个奇怪的要求。 – 2010-09-23 11:34:39

回答

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

你可以做到以下几点:

  • 保持比较相邻数组键。如果 他们是连续的,你什么都不做。
  • 如果不是连续的,那么你 检查它们的值,如果该值有 从更高的价值,以一个较低的 值下降,就意味着有一个 复位,所以你什么都不做。
  • 如果该值没有下降,那么它 是一个缺少密钥的情况。两个键之间的所有 数字(不包括 )都是结果的一部分。

翻译在代码:

$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

+0

感谢ideone.com,我不知道这个网站! – benjisail 2010-09-23 12:31:06

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的非常聪明的解决方案;-)

+0

如果min和max之间的差距非常大,则此解决方案看起来很慢。这可能发生在我的情况。但是,谢谢! – benjisail 2010-09-23 12:19:40