0

私はphpの自然なソートアルゴリズムを使用しnatsortていますが、メモリ使用量について考慮しています。

これがその方法です。スクリプトは mysql からデータを取得し、結果を配列に入れ、それを適用natsortします。しかし、ここに問題があります。行のテキストは長くなる可能性があり、何百行もある可能性があります。

コード例:

$array = array();
while ($row = $db->getResults()) {
  $array[$row->code] = $row->text;
}

if (empty($array)) {
  uksort($array, "strnatcmp");
}

これがどのように記憶に影響を与えているのだろうか?これは適切なアプローチですか、それともより効率的でメモリを快適にする必要がありますか?

4

2 に答える 2

1

できることの 1 つは、並べ替えたい列を複製する新しい列を保存することですが、通常の並べ替えアルゴリズムを使用すると自然に並べ替えられる変換された形式で保存します。

概念的には、文字列で発生する可能性のある最長の数値シーケンスと同じ長さになるまで、数字シーケンスの左にゼロを埋め込むことでこれを行うことができます。

私の解決策は完全に頑丈というわけではありませんが、文字列に既知の最大長の数字シーケンスがあるだけの場合は、その既知の最大長までゼロを埋め込むことができます。たとえば、次のようにタイトルにトラック番号が埋め込まれた CD トラック タイトルがあるとします。

1 Foo
2 Bar
...
10 Baz

可能な最長の数値シーケンスが 3 (999 トラックの可能性) になると判断した場合、次のように数値シーケンスをパディングします。

001 Foo
002 Bar
...
010 Baz

これは、複数の数値シーケンスを持つ文字列でうまく機能します。

サンプル php コード。ただし、これを行うために mysql ストアド関数を記述し、テーブルで挿入トリガーと更新トリガーを使用して、テーブルが透過的に維持されるようにします。

$input = 'a44b1c399d4';
$nat = preg_replace_callback('#\d+#', function($m) {
    return str_pad($m[0], 3, '0', STR_PAD_LEFT);
}, $input);
echo $nat; // a044b001c399d004

次に、mysqlでソートするだけです

order by natsort_column

これにより、その列にインデックスを配置することもでき、優れたソート パフォーマンスが得られます。

于 2013-01-26T18:36:57.107 に答える
-1

何千もの不要なレコードを解析するために PHP レベルで時間を無駄にしないように、MySQL WHEREGROUP BY、および句を使用する必要があります。ORDER BY

于 2013-01-26T17:10:59.647 に答える