2011-05-03 154 views
1

我想知道是否有人在優化下面的代碼方面有什麼好的想法。我有一個多維數組($列表)如下:優化重新排序和重複刪除多維數組

Array 
(
    [0] => Array 
    (
     [id] => 1 
     [title] => A good read 
     [priority] => 10 
    ) 

    [1] => Array 
    (
     [id] => 2 
     [title] => A bad read 
     [priority] => 20 

    ) 

    [2] => Array 
    (
     [id] => 3 
     [title] => A good read 
     [priority] => 10 
    ) 
) 

首先,我刪除共享相同的標題(無論什麼其它值),如下所示的條目:

$List_new = array(); 
foreach ($List as $val) { 
    $List_new[$val['title']] = $val;  
} 
$List = array_values($List_new); 

完美。然後我重新排序陣列,首先由優先級字段,然後ID:

$sort_id = array(); 
$sort_priority = array(); 
foreach ($List as $key => $row) { 
    $sort_id[$key] = $row['id']; 
    $sort_priority[$key] = $row['priority']; 
} 
array_multisort($sort_priority, SORT_DESC, $sort_id, SORT_DESC, $List); 

兩個代碼塊出現在一個循環中,$ sort_id和重新排序前$ sort_priority因此結算。

有沒有更好的方法來做到這一點 - 即使用排序過程刪除重複的標題條目?這個代碼塊正在執行循環高達500,000條記錄,所以任何改進都會受到歡迎!

回答

1

一個循環,但有一些額外的函數調用,所以我不能告訴你大O如何改變。有一點需要注意,數字周圍的填充必須足夠大以防止溢出,即2 =最大99個優先級,6 =最大999,999個項目。

$list_titles = array(); 
foreach($List as $val) { 
    if(isset($list_titles[$val['title']])) continue; 
    $list_titles[$val['title']] = true; 
    $List_new[str_pad($val['priority'], 2, 0, STR_PAD_LEFT).str_pad($val['id'], 6, 0, STR_PAD_LEFT)] = $val; 
} 
krsort($List_new); 

編輯:做了一些小的修改。