2011-05-03 157 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); 

编辑:做了一些小的修改。