比较php中的大量数据

时间:2014-02-25 14:33:32

标签: php

我有两个数组,$posters (945 records)$stats_results(6000 records)。我将这两个数组相互比较,以查找从$posters数组到$stats_results数组的记录。一切正常,但需要90秒或更长时间。如何更快地完成此过程。这就是我所做的。

 for ($j=0; $j < count($posters); $j++)//945 records
    { 
     for ($i=0; $i < count($stats_results) ; $i++)//6000 records
     {
        if($stats_results[$i]['path'] == '/'.$posters[$j]['path'])
        {
         if(date('Ymd',strtotime($stats_results[$i]['start_date']))>=date('Ymd',strtotime($posters[$j]['start_date'])) && date('Ymd',strtotime($stats_results[$i]['start_date']))<=date('Ymd',strtotime($posters[$j]['end_date']) ))
         {
             $stats[]=array(
               //I am storing filtered value in the array 
             );
         }
     }
  }

正如我所说,一切正常。没有可靠的问题。有没有更好的方法来做到这一点? 提前谢谢。

根据建议改进代码。它工作正常:

$posters_stats=array();
foreach ($posters as $key => $value)
{
  $path = '/'.$value['Identifier'];
  $posters_stats[$path]=array(
    'sdate'=>date('Ymd',strtotime($value['Presentation_Date'])),
    'enddate'=>date('Ymd',strtotime($value['Expiry_Date']))
  );
}
foreach ($stats as $key => $stats_result)
{
  if(isset($posters_stats[$stats_result["path"]]))
  {
    if(strtotime($stats_result["date"])>=strtotime($posters_stats[$stats_result["path"]]['sdate']))
     {
       echo "<pre>";
       print_r($stats_result);
     }
   }else{
       echo "<pre>";
       print_r($stats_result);
   }
}

谢谢大家的贡献:)

2 个答案:

答案 0 :(得分:2)

我认为你可以用以下形式转换$ posters数组:

$ posters [$ path] = array(“start_date”=&gt;“...”,“end_date”=&gt;“..”);

然后你可以使用

foreach ($stats_results as $key => $stats_result)
{
      if(array_key_exist($stats_result["path"] ,$posters))
      ...
}

会更快

foreach ($stats_results as $key => $stats_result)
{
      if(isset($posters[$stats_result["path"]]))
      ...
}

所以你只有945轮而不是945 * 6000。

答案 1 :(得分:0)

foreach ($posters as &$poster) {

    $stats[] = array_filter($stats_results, function($item) use ($poster) {

        return 
            ($item['path'] == '/' . $poster['path'] &&
            $item['start_date'] >= $poster['start_date'] &&
            $item['start_date'] <= $poster['end_date'];

    });

}

array_filter与lambda函数一起使用。我不确定这是你想要的,但是这个片段会增加$ stats,无论$ stats_results符合条件。

这可能会快一点(我不确定你为什么要将时间戳转换为日期来进行比较),这避免了每次计算元素的数量,避免增加不必要的变量($ j和$ i) )。不会避免疯狂的嵌套循环,但更具可读性。