我從數據庫中獲取數據。每個結果看起來像這樣在PHP中唯一地結合數千個數組的最快方法
ASDF-1234-JKL-F1-STUFF
有50,000個結果。每一個被爆炸
$exploded = explode('-',$dash_delimited_datum);
// $exploded = array('ASDF','1234','JKL','F1','STUFF');
我嘗試這樣做:
$data = array();
while($row = mysql_fetch_array($result)){
$i++;
if($i > 99999) {
break;
}
$data = array_merge($data,explode('-',$row[0]));
}
但是我打了5分鐘,它的服務器超時。
而這並沒有在所有的工作:沒想到
while($row = mysql_fetch_array($result)){
$i++;
if($i > 99999) {
break;
}
$data_parts = explode('-',$row[0]);
foreach($data_parts as $value) {
$data = array_push(($data,$value);
}
}
,這個工作,以 「只有」 9秒,但我不知道如果我可以使它更快:
while($row = mysql_fetch_array($result)){
$i++;
if($i > 99999) {
break;
}
$data = array_unique(array_merge($data,explode('-',$row[0])));
}
編輯:我想出了一個解決方案,我認爲將是最好的,在800毫秒 請注意,我用「封閉」(匿名函數)刪除數字鍵,我認爲這是一個速度拖動。但實際上,刪除它會導致腳本在30秒後超時。
$data=array();
while($row = mysql_fetch_array($result)){
$i++;
if($i > 99999) {
break;
}
$data_parts = array_flip(array_filter(explode('-',$row[0]),
function($value) {
if(is_numeric($value)) {
return false;
} else return true;
}));
$data = array_merge($data,$data_parts);
}
$data = array_keys($data);
sort($data);
結論:
每個快速回答使用技巧涉及數組鍵,而不是值。我的最佳答案和下面兩個非常快速的答案之間的差異似乎是while loop
中foreach
的使用,它們將值直接分配給主要的$data
陣列。 PHP 功能調用據說很貴,這個例子似乎證明他們真的是。這兩個最佳答案在300毫秒以內給了我結果。當我篩選出數字值時,我的最佳答案只能工作得很快,否則會遇到30秒的服務器超時。
所以,我想,如果你正在處理大量的數據,只要你能使用結構和不是功能。
請注意(是的,我知道他們已棄用)mysql函數 一個答案建議我使用mysql_fetch_assoc
而不是mysql_fetch_array
。實際上,mysql_fetch_row
應該是「最快的」,但是這種改變使用該數據集的頁面加載速度(約48,000個結果)完全沒有區別。我也嘗試使用mysql_result
。 PHP文檔說,檢索多行時速度較慢,速度較慢。
加載時間爲6.27秒,而類似結構的最佳答案爲約0.27秒(270毫秒)。
$i=0;
while($data_parts = explode('-',mysql_result($result,$i,0))){
$i++;
if($i > 99999) {
break;
}
foreach($data_parts as $value) {
$data[$value] = 1;
}
}
$data = array_keys($data);
嘗試使用'mysql_fetch_assoc',而不是'mysql_fetch_array'。 mysql_fetch_array返回數字和關聯索引(有效地加倍數組的大小)。另外,儘量在'while'循環中儘量使用一些小函數。例如,如果迭代50,000個元素,並且在每次迭代中都有3次函數調用,那麼函數被調用的次數是150,000次。 –
你可以通過將'array_unique'移動到循環之外來加速它。 – h2ooooooo