web-dev-qa-db-ja.com

多次元配列を再帰的にソートする-これは合理的ですか

一言で言えば、多次元配列の任意の数の次元を横断する(または横断しない)必要があり、プロセスをできるだけ予測可能にしたい(より大きな一連の作業全体でパターンを増殖させるため)。だから私はこれを思いつきました-それはあまりにも簡単に感じます。このようにksortを使用しているパフォーマンスシンクで、知らないものはありますか?これを達成するためのよりクリーンでパフォーマンスの高い方法はありますか?私の目標は、いくつかのより関連性の高い情報の配列であるネストされた関連性のある値を持つ階層化スコアシステム(例:本当に複雑なゴルフカードなど)を使用するために、奇妙なデータグループの膨大なボディを(数値的に)ソートすることでした。

これは悪い習慣ですか? :

function recursive_key_sort(&$by_ref_array)
{
    ksort($by_ref_array, SORT_NUMERIC );
    foreach ($by_ref_array as $key => $value) {
        if (is_array($value))
        {
            recursive_key_sort($by_ref_array[$key]);
        }
    }
}

同様の質問が表示されなかったので、事前に謝罪します。ここでも、私の主な関心/懸念は「これは簡単すぎるように思えました」のおかげです。

3
Brandt Solovij

いくつかの調査の後、私はこれがかなり最適に思われると思います。要旨をご覧ください こちら

PHPファイルで、1つの関数を使用して、ソートされていないキーを含むいくつかのネストされた配列を生成しました。 count 、上記の関数を使用して配列を時間指定でソートし、ソートされていないキーを含むフラット配列を生成し、ksortを使用してこれを時間指定でソートしました。

私はこれをさまざまなトップレベルのキーの範囲に対して行い、それぞれ16回、平均を取ってから、出力データをgnuplotで実行しました。

出力グラフから、再帰関数(紫)がフラット配列(青)のksortに向かっていることがわかります。合計キーが100万を超えると、再帰ソートは平均で約1.5倍の時間しかかかりません。同等の数のキーのフラットソートの。

これは、PHP 5.6.10、ArchLinux、YMMVで実行されました。

5
Benjamin