我有兩個數組,$posters (945 records)
和$stats_results(6000 records)
。我將這兩個數組相互比較,以查找$posters
數組中的記錄到$stats_results
數組。一切正常,但需要90秒或更長時間。我怎樣才能使這個過程更快。這是我所做的。比較php中的大數據集
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
);
}
}
}
正如我所說的一切工作正常。沒有mameory問題。有沒有更好的方法來做到這一點? 在此先感謝。
基於建議的改進代碼。它工作正常:
$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);
}
}
謝謝大家的貢獻:)
將你的調用放到'for'語句之外的'count()'。你有6495個電話給它,你只需要2. –
這個問題似乎是脫離主題,因爲它是一個代碼審查請求。這更適合http://codereview.stackexchange.com –
如果這些記錄來自數據庫,或者重新考慮用於存儲它們的數據庫設計,請在'MySQL'級別比較這些記錄。儘管如此,在PHP中進行大約500萬次比較並不理智。 – CodeAngry