2016-12-25 4 views
1

かなり大きな多次元配列をキー名(ではなく、値)でソートしようとしていますが、できるだけ速くする必要があります。深い多次元配列または結果のJSONをキー名で並べ替え

結果の配列はJSONに変換されてファイルに保存されるため、JSONをキーでソートする方法がある場合は、必要なものすべてを処理します。

私は、Pythonsの同等のPHPを見つけることを効果的に試みていますjson.dumps(dict, sort_keys = True, indent = 4) < - sort_keysオプション。


私はuksort($array, 'strnatcasecmp');を試してみましたが、それは私もいくつかの他の「カスタム」の解決策を試してみましたが、私が試したものは、高速かつ十分なエレガントではなかった、まったく動作しませんでした。

また、「キー/キー名によるPHPディープソート多次元配列」という検索結果は何もありません。最後にタイトルのキーで並べ替えを行うすべての質問は、特定のキーの値でソートする必要があります。

これを行う簡単な方法はありますか?


これは、これは私が(あなたが見ることができるよう、すべての単一の配列のキーがアルファベット順にソートされる)を取得するために必要なものであるような配列

array(
    'common' => array(
     'zyu' => 'something', 
     'gka' => 'something', 
     'lfi' => 'something', 
     'abc' => 'something', 
    ), 
    'data_result' => array(
     'doc' => array(
      66145 => array(
       'lfk' => 'something', 
       'eks' => 'something', 
       'abc' => 'something' 
      ),    
      34154 => array(
       'lfk' => 'something', 
       'eks' => 'something', 
       'abc' => 'something' 
      ) 
     ), 
     'zus' => array(
      // some data 
     ), 
     'llo' => 'something', 
     'abc' => 'something' 
    ), 
    'data_1' => array(
     // Array with lots of values and another arrays inside 
    ), 
    'post' => array(
     'id' => 15525, 
     'time' => 156652363, 
     'something' => 'something' 
    ) 
); 

の簡単な例です:

array(
    'common' => array(
     'abc' => 'something', 
     'gka' => 'something', 
     'lfi' => 'something', 
     'zyu' => 'something', 
    ), 
    'data_1' => array(
     // Array with lots of values and another arrays inside 
    ), 
    'data_result' => array(
     'abc' => 'something' 
     'doc' => array(
      34154 => array(
       'abc' => 'something' 
       'eks' => 'something', 
       'lfk' => 'something', 
      ) 
      66145 => array(
       'abc' => 'something' 
       'eks' => 'something', 
       'lfk' => 'something', 
      ),    
     ), 
     'llo' => 'something', 
     'zus' => array(
      // some data 
     ), 
    ), 
    'post' => array(
     'id' => 15525, 
     'something' => 'something' 
     'time' => 156652363, 
    ) 
); 

配列が非常に大きいため(結果として得られるJSONファイルは5500〜7000行(場合によってはさらに少し)があります)、foreachループや配列の重複を避けようとしています。この操作はqui私は頻繁にJSONファイルを人間が読みやすく、デバッグできるようにするためにサーバーを過負荷にしたくありません。


Ps:私はこれらの配列を作成していません。それらの配列の大部分はJSON形式のバイナリから読み込まれます。私はそれらを1つの配列に結合して、いくつかの操作(いくつかのカスタム値の追加など)を行ってからJSONとして保存します。

不明な点がある場合は(私のピーク時には私の午前3時35分)、コメントを投稿し、必要に応じて質問を編集します。

ありがとうございました。

答えて

1

は、各配列項目のためのksortを呼び出す再帰関数書く:

function ksort_recursive(array &$a) { 
    ksort($a, SORT_NATURAL | SORT_FLAG_CASE); 

    foreach ($a as $k => $v) { 
    if (is_array($v)) { 
     ksort_recursive($a[$k]); 
    } 
    } 
} 
+0

おかげで、この関数の実行が+とるようこれは、私が避けるためにしようとしたものです - 通常の周りに、私のテストから(0.01秒'0.009605884552秒')とIMO、それは本当に長い時間プラス私はCPU上でどのように大きな負荷を確認していない。これは唯一の可能な/最速の方法ですか? – MiChAeLoKGB

+0

これは本当にサーバー側で必要ですか?デバッグ専用の場合は、クライアント側(JavaScript)でソートすることを検討してください。常に良い方法がありますが、私はそれを見つけることができませんでした。 AFAIKは、基本的なクイックソートアルゴリズムが一般的に最高です。サーバー側で配列をソートする必要がある場合は、上記の関数をC(PHP拡張モジュール)で実装することをおすすめします。これにより、PHP関数呼び出しのオーバーヘッドがなくなります。ああ、空の配列がたくさんある場合、空のチェックはいくつかの反復を減らします: 'if(is_array($ v)&& $ v){ksort_recursive($ a [$ k]); } '。 –

+0

これは 'RecursiveArrayIterator'を使って実装することができます。それはいくつかのメモリを節約するかもしれないが、私はそれがより速くなるとは思わない。 –

関連する問題