PHPでは、 NATSORT関数は、「自然な順序」で配列の要素をソートする一般的に使用されるソートメソッドです。この並べ替え方法は、従来のASCIIコードの順序ではなく、「10」という数字が「2」の前にランク付けされるなど、人間の読書習慣に沿ったものになる可能性があります。しかし、 NatSortで並べ替えると、問題が発生する可能性があります。配列のキー値をリセットして、元のキー値が失われます。これにより、後続の操作の元のキー値に基づいてデータにアクセスすることが困難になる可能性があります。
この記事では、Arrayの元のキー値の変更を避け、関連するヒントと代替案を紹介する方法について説明します。
NATSORT関数の関数は、「自然な順序」に基づいて配列をソートすることです。いわゆる自然な注文ソートとは、文字列の辞書順序で並べ替えるのではなく、ソート時に数字を並べ替えることを指します。例えば:
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'a20'</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">natsort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>
上記のコードを実行した後、出力結果は次のとおりです。
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[</span><span><span class="hljs-number">2</span></span><span>] => a1
[</span><span><span class="hljs-number">1</span></span><span>] => a2
[</span><span><span class="hljs-number">0</span></span><span>] => a10
[</span><span><span class="hljs-number">3</span></span><span>] => a20
)
</span></span>
ご覧のとおり、 NatSortは数字のサイズで配列をソートしますが、配列のキー値をリセットして、要素に関連する元のキーが保存されなくなります。
NATSORTを使用するときに元のキー値を保持する場合は、ソートする前に元の配列のキー値を保存してから、ソートされた配列を再構築できます。これにより、ソートプロセスが元のキー値に影響しないことが保証されます。
配列の値を抽出して、キー値を変更せずに並べ替えることができます。これは、 array_values関数によって達成されます。特定の方法は、最初に元のキー値を保持し、次に並べ替えることです。
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> => </span><span><span class="hljs-string">'a20'</span></span><span>];
</span><span><span class="hljs-comment">// 元のキー値を保存します</span></span><span>
</span><span><span class="hljs-variable">$original_keys</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-comment">// 自然に値をソートします</span></span><span>
</span><span><span class="hljs-title function_ invoke__">natsort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-comment">// 元のキー値を復元します</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(</span><span><span class="hljs-variable">$original_keys</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>
出力結果:
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[a] => a1
[b] => a2
[c] => a10
[d] => a20
)
</span></span>
このアプローチでは、元のキー値は最初にarray_keysによって取得され、次にArrayはNatsortを使用してソートされます。ソートが完了したら、 array_combineを使用して、キー値とソートされた値の間の対応を回復します。
別の方法は、カスタムソートにUASORT関数を使用することです。 NatSortと同様に、 UASORTは配列をソートできますが、キー値は変更されません。カスタムソート関数を実装することにより、元のキー値を保持しながらソートメソッドを制御できます。
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> => </span><span><span class="hljs-string">'a20'</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">uasort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strnatcmp</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>);
});
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>
UASORTは、 strnatcmp関数を内部的に使用して、配列の重要な値を変更せずに自然順序のソートメソッドをシミュレートするコールバック関数を介してソートを実装します。
出力結果:
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[c] => a1
[b] => a2
[a] => a10
[d] => a20
)
</span></span>
NatSortは強力なソート機能ですが、配列の重要な値をリセットします。ソートプロセス中にキー値を保持する必要がある場合は、2つの方法のいずれかを使用できます。
最初に元のキー値を保存し、ソート後にarray_combineを介してキー値を復元します。
キー価値の損失を回避するために、カスタムソートにUASORT関数を使用します。
これらの2つの方法を使用すると、アレイが自然にソートされた後も元のキー値を変えないようにし、ソートプロセス中にデータ損失を回避できます。