如何在日期数组中实现日期间隔的性能搜索?

时间:2013-10-28 19:47:09

标签: php arrays search

拥有这个数组:

array (size=1)
  24 => 
    array (size=7)
      'user_id' => int 24
      'date_clicked' => 
        array (size=3)
          0 => int 1382867319
          1 => int 1382867419
          2 => int 1382940698
      'ip' => string '127.0.0.1' (length=9)
      'email' => string 'test' (length=8)
      'name' => string 'test' (length=7)
      'request' => string 'test content' (length=12)
      'faked_clicks' => 
        array (size=3)
          0 => int 1382867319
          1 => int 1382867419
          2 => int 1382940698  

这是我的实现,它根据点击日期的数组添加faked_clicks数组:

foreach($parsedUserClicks as $k => $v) {
    foreach($v['date_clicked'] as $kk => $vv) {
        $rangeHigh = range($vv, $vv+(60*60*24));
        $checkHigh = array_intersect($v['date_clicked'], $rangeHigh );
        if(count($checkHigh) >= 3) {
            $parsedUserClicks[$k]['faked_clicks'] = $checkHigh;
        }
    }
} 

问题在于,通过使用array_intersect,需要花费很长时间才能搜索3个时间戳。

我想要实现的是获得间隔为1天的所有3个日期。但是我的搜索太慢了(这个简单搜索只需5秒)。我可以用于此类搜索的任何算法?

P.S。 :我知道我不应该使用如此大的范围来交叉数组(60 * 60 * 24)。但我似乎无法找到另一种解决方案。此外,范围可能会变大,因此这种方法最终会下降。

2 个答案:

答案 0 :(得分:1)

如何简单地检查值?

$dc_copy = $v['date_clicked'];
foreach($parsedUserClicks as $k => $v) {
    $checkHigh = array();
    foreach($v['date_clicked'] as $kk => $vv) {
        $rangeHigh = $vv+(60*60*24);
        foreach($dc_copy as $v2){
            if($v2 >= $vv && $v2 <= $rangeHigh){
                $checkHigh[] = $v2;
            }
        }
        if(count($checkHigh) >= 3) {
            $parsedUserClicks[$k]['faked_clicks'] = $checkHigh;
        }
    }
} 

答案 1 :(得分:0)

我现在能想到的唯一解决方案是尽量减少在几秒钟内进行的搜索。这不是最后的回答,也许其他人可以为这种类型的搜索提供适当的搜索算法。