【问题标题】:Optimize reordering and duplicate removal of multi-dimensional array优化多维数组的重排和去重
【发布时间】:2011-08-17 16:32:21
【问题描述】:

我想知道是否有人对优化以下代码有任何好的想法。我有一个多维数组($List)如下:

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 条记录的循环中执行,因此欢迎任何改进!

【问题讨论】:

    标签: php optimization multidimensional-array array-multisort


    【解决方案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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-03
      • 2010-12-24
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      相关资源
      最近更新 更多