かなり大きな多次元配列をキー名(ではなく、値)でソートしようとしていますが、できるだけ速くする必要があります。深い多次元配列または結果の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分)、コメントを投稿し、必要に応じて質問を編集します。
ありがとうございました。
おかげで、この関数の実行が+とるようこれは、私が避けるためにしようとしたものです - 通常の周りに、私のテストから(0.01秒'0.009605884552秒')とIMO、それは本当に長い時間プラス私はCPU上でどのように大きな負荷を確認していない。これは唯一の可能な/最速の方法ですか? – MiChAeLoKGB
これは本当にサーバー側で必要ですか?デバッグ専用の場合は、クライアント側(JavaScript)でソートすることを検討してください。常に良い方法がありますが、私はそれを見つけることができませんでした。 AFAIKは、基本的なクイックソートアルゴリズムが一般的に最高です。サーバー側で配列をソートする必要がある場合は、上記の関数をC(PHP拡張モジュール)で実装することをおすすめします。これにより、PHP関数呼び出しのオーバーヘッドがなくなります。ああ、空の配列がたくさんある場合、空のチェックはいくつかの反復を減らします: 'if(is_array($ v)&& $ v){ksort_recursive($ a [$ k]); } '。 –
これは 'RecursiveArrayIterator'を使って実装することができます。それはいくつかのメモリを節約するかもしれないが、私はそれがより速くなるとは思わない。 –