Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】SORT_NATURAL定数の使い方

SORT_NATURAL定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

SORT_NATURAL定数は、PHPの配列をソートする際に、自然順アルゴリズムを適用することを示す値を表す定数です。この定数は、特にファイル名やバージョン番号のように数字を含む文字列をソートする際に非常に役立ちます。

通常の文字列ソート(辞書順ソート)では、文字列は文字コードの順序に基づいて比較されます。例えば、「file10.txt」と「file2.txt」を比較すると、「1」は「2」よりも小さいため、「file10.txt」が「file2.txt」よりも先に並べられてしまうことがあります。これは、人間が直感的に期待する順序とは異なる場合が多いです。

SORT_NATURAL定数をPHPのソート関数、例えばsort()asort()array_multisort()などの第2引数であるsort_flagsに指定することで、文字列内の数字部分が数値として扱われ、全体としてより人間が認識する自然な順序でソートされます。具体的には、「file2.txt」が「file10.txt」よりも前に並ぶといった結果が得られます。これにより、直感的に理解しやすい順序でデータを整理できるようになります。

この定数は、ウェブアプリケーションでファイルの一覧を表示する際や、バージョン管理されたデータの履歴を並べ替える際など、プログラミングにおいて文字列データを自然な順序で処理したい多くの場面で活用されます。

構文(syntax)

1$array = ['img10.png', 'img2.png', 'img1.png'];
2sort($array, SORT_NATURAL);

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP: SORT_NATURALで自然順ソートする

1<?php
2
3/**
4 * PHPのSORT_NATURAL定数を使用して、配列を自然順ソートする例を示します。
5 *
6 * SORT_NATURALは、sort()やasort()などのソート関数に渡すフラグで、
7 * 数字を含む文字列を人間が期待する自然な順序(例: 1, 2, 10, 20)でソートするために使用されます。
8 */
9function demonstrateNaturalSort(): void
10{
11    // ソート対象の文字列配列。数字部分の桁数が異なる要素が含まれています。
12    $items = [
13        'item10.txt',
14        'item1.txt',
15        'item20.txt',
16        'item2.txt',
17        'item_a.txt',
18        'item_b.txt',
19    ];
20
21    echo "--- ソート前の配列 ---" . PHP_EOL;
22    foreach ($items as $item) {
23        echo $item . PHP_EOL;
24    }
25    echo PHP_EOL;
26
27    // 自然順ソートのために配列をコピー
28    $naturallySortedItems = $items;
29
30    // sort()関数とSORT_NATURAL定数を使って自然順ソートを実行
31    // 通常のソート(辞書順)と比較して、数字の順番が正しくなります。
32    sort($naturallySortedItems, SORT_NATURAL);
33
34    echo "--- 自然順ソート後の配列 (sort() と SORT_NATURAL を使用) ---" . PHP_EOL;
35    foreach ($naturallySortedItems as $item) {
36        echo $item . PHP_EOL;
37    }
38    echo PHP_EOL;
39
40    // 参考: 通常のソート(辞書順)の場合
41    // 数字部分が文字列として比較されるため、「10」が「2」より前に来る場合があります。
42    $standardSortedItems = $items;
43    sort($standardSortedItems); // 第二引数を指定しないと通常の辞書順ソートになります
44
45    echo "--- 通常ソート後の配列 (sort() のみ) ---" . PHP_EOL;
46    foreach ($standardSortedItems as $item) {
47        echo $item . PHP_EOL;
48    }
49    echo PHP_EOL;
50}
51
52// 関数を実行して、自然順ソートの結果を表示
53demonstrateNaturalSort();

PHPのSORT_NATURALは、配列をソートする際に、文字列内の数字部分を人間が自然だと感じる順序で並べ替えるための定数です。例えば、「item1.txt」の次に「item2.txt」、そして「item10.txt」と続くようにソートされます。これは、通常の辞書順ソートでは「item1.txt」の次に「item10.txt」、それから「item2.txt」となる場合があるのに対し、数字の大小を正しく認識して並べ替える点が異なります。

この定数は、sort()asort()といったPHPのソート関数の第二引数に指定して使用します。SORT_NATURAL自体は引数を取らず、戻り値もありませんが、ソート関数の動作を制御する「フラグ」として機能します。

サンプルコードでは、数字の桁数が異なる要素を含むファイル名の配列を例に、SORT_NATURALを使用した自然順ソートと、定数を指定しない通常のソートの結果を比較しています。自然順ソートでは、人間が期待する通りの順番で要素が並び替えられていることが確認できます。これにより、ファイル名やバージョン番号など、文字列内に数字が含まれるデータを適切に並べたい場合に、SORT_NATURALが非常に役立つことが理解できます。

このサンプルコードでは、PHPのSORT_NATURAL定数を用いて、数字を含む文字列配列を人間が直感的に理解できる自然な順序でソートする方法を示しています。通常のソート(辞書順)では、「item10.txt」が「item2.txt」よりも前に並ぶことがありますが、SORT_NATURALを指定することで、このような場合に正しい順序で並べ替えられます。sort()関数は、渡された配列そのものを直接変更する(破壊的変更)ため、元の配列の情報を保持したい場合は、ソート前に配列をコピーすることを忘れないでください。この定数は、ファイル名やバージョン番号のように数字と文字が混在するデータを扱う際に非常に有用です。

PHP usortによる自然順ソートする

1<?php
2
3/**
4 * usort() 関数と strnatcmp() を使用して、自然順ソートのサンプルを示します。
5 *
6 * strnatcmp() は、人間がファイル名を認識するのと同様のアルゴリズムで、
7 * 数字を含む文字列を比較する関数です。
8 * SORT_NATURAL 定数は、主に sort() などの組み込みソート関数で
9 * この自然順ソートの動作を有効にするために使用されますが、
10 * usort() では、比較関数として strnatcmp() を直接指定します。
11 */
12function demonstrateNaturalSortWithUsort(): void
13{
14    // 自然順ソートで違いが分かりやすいように、数字を含む文字列の配列を準備します。
15    $files = [
16        'img10.png',
17        'img1.png',
18        'img2.png',
19        'img20.png',
20        'img1.txt',
21    ];
22
23    echo "--- ソート前の配列 ---" . PHP_EOL;
24    print_r($files);
25
26    // usort() を使用して配列を自然順でソートします。
27    // 比較関数として strnatcmp() を渡します。
28    usort($files, 'strnatcmp');
29
30    echo "--- usort() と strnatcmp() で自然順ソート後の配列 ---" . PHP_EOL;
31    print_r($files);
32
33    // 補足:
34    // もし usort() ではなく、組み込みの sort() 関数を使う場合は、
35    // SORT_NATURAL 定数をソートフラグとして渡すことができます。
36    // 例: sort($files, SORT_NATURAL);
37    // しかし、このサンプルはキーワード 'usort' に焦点を当てています。
38}
39
40// 関数の実行
41demonstrateNaturalSortWithUsort();
42
43?>

このPHPコードは、usort()関数とstrnatcmp()関数を組み合わせて、配列を「自然順ソート」で並べ替える方法を示しています。自然順ソートとは、例えば「img1.png」の次に「img2.png」、その次に「img10.png」といったように、人間がファイル名などを見たときに自然だと感じる順番で、数字を含む文字列を比較して並べ替える方法です。

usort()関数は、ユーザー定義の比較関数を用いて配列の要素をソートします。この関数は、第1引数でソートしたい配列を受け取り、第2引数に比較を行う関数名を指定します。usort()は渡された配列自体を直接変更(インプレースソート)するため、戻り値はありません。

サンプルコードでは、比較関数としてstrnatcmp()を指定しています。strnatcmp()関数は、2つの文字列を引数として受け取り、自然順のルールに基づいて比較し、結果を整数で返します(第1引数が第2引数より小さい場合は負の値、等しい場合は0、大きい場合は正の値)。この戻り値によってusort()は要素の正しい順序を決定します。

SORT_NATURAL定数は、本来sort()のようなPHPの組み込みソート関数で使用するもので、自然順ソートの動作を有効にするためのソートフラグです。しかし、usort()を使用する場合は、比較ロジックを直接提供する必要があるため、strnatcmp()関数をコールバックとして渡すことで、SORT_NATURALと同様の自然順ソートを実現しています。このコードは、準備されたファイル名のリストを自然順に正しく並べ替える結果を示しています。

このサンプルコードは、数値を含む文字列を自然な順序でソートするため、usort()関数とstrnatcmp()関数を組み合わせて使用しています。初心者が注意すべき点は、SORT_NATURAL定数がusort()関数には直接適用できないことです。SORT_NATURALは、主にsort()asort()のようなPHPの組み込みソート関数でソートフラグとして利用されます。usort()を使用する際は、配列要素を比較する具体的な関数(この例ではstrnatcmp())を第二引数に直接指定する必要があります。strnatcmp()は、人間がファイル名を認識するのと同様に、数字を含む文字列を正しく比較します。また、usort()は元の配列の順序を直接変更(インプレースソート)しますので、元の配列を保持したい場合は、事前にコピーを作成してから実行してください。

関連コンテンツ