1

次のコードを最適化するための良いアイデアを誰かが持っているかどうか疑問に思います。次のような多次元配列($ 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レコードのループで実行されているため、改善を歓迎します。

4

1 に答える 1

1

1つのループですが、いくつかの追加の関数呼び出しがあるため、BigOがどのように変化するかはわかりません。注意すべき点の1つは、数字の周りのパディングは、オーバーフローを防ぐのに十分な大きさである必要があります。つまり、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);

編集:いくつかの小さな変更を加えました。

于 2011-05-03T15:13:51.070 に答える