我有两个数组,$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);
}
}
谢谢大家的贡献:)
答案 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) )。不会避免疯狂的嵌套循环,但更具可读性。