【PHP8.x】natsort関数の使い方

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

作成日: 更新日:

基本的な使い方

natsort関数は、配列を「自然順」アルゴリズムを用いてソートを実行する関数です。この「自然順」とは、人間が直感的に認識する順序で文字列を並べ替える方法を指します。例えば、sort関数のような標準的な文字列ソートでは、"item10"は"item2"より前に来ますが、natsort関数を使うと、文字列中の数字部分を数値として比較するため、"item2"、"item10"という、人間にとって自然な順序でソートされます。この機能は、特にバージョン番号やファイル名など、数字を含む文字列を扱う際に非常に便利です。

この関数は、引数として渡された配列そのものを直接変更します。ソート後もキーと値の関連性は維持されるため、連想配列にも適しています。関数の戻り値は、ソートが成功したかどうかを示すブール値(成功時にtrue、失敗時にfalse)であり、ソートされた配列そのものではない点に注意が必要です。なお、このソートは大文字と小文字を区別します。大文字と小文字を区別せずに自然順ソートを行いたい場合は、natcasesort関数を使用してください。

構文(syntax)

1<?php
2// ソート対象の配列を定義します
3$array = ["img12.png", "img10.png", "img2.png", "img1.png"];
4
5// natsort() を使って、"自然順" で配列をソートします
6// この関数は、元の配列を直接変更し、成功した場合に true を返します
7natsort($array);
8
9// ソート後の配列を出力します
10// 出力結果:
11// Array
12// (
13//     [3] => img1.png
14//     [2] => img2.png
15//     [1] => img10.png
16//     [0] => img12.png
17// )
18print_r($array);

引数(parameters)

array &$array

  • array $array: ソート対象の配列。この配列は参照で渡されるため、関数内で直接変更されます。

戻り値(return)

bool

配列を自然順ソートした結果を返します。成功した場合はtrue、失敗した場合はfalseを返します。

サンプルコード

PHP natsortで連想配列を自然順ソートする

1<?php
2
3/**
4 * natsort() 関数のサンプルコード。
5 *
6 * この関数は、配列の値を「自然順アルゴリズム」でソートします。
7 * キーワード「natsort by key」を考慮し、特に連想配列(文字列キーを持つ配列)の場合に、
8 * キーと値の関連が維持されることを示します。
9 *
10 * 注意: natsort() は配列の「値」をソートし、元のキーを並べ替えます。
11 * 数値キーを持つ配列の場合、ソート後にキーは0から始まる連番に再インデックスされます。
12 * 文字列キーを持つ連想配列の場合、キーとその値の関連は維持されます。
13 */
14function demonstrateNatsortBehavior(): void
15{
16    // ファイル名のような文字列を含む連想配列を準備します。
17    // キーは元の識別子、値はソートしたいデータです。
18    $data = [
19        'first_entry'  => 'document10.txt',
20        'second_entry' => 'document2.txt',
21        'third_entry'  => 'document1.txt',
22        'fourth_entry' => 'document20.txt',
23        'fifth_entry'  => 'document_alpha.txt',
24        'sixth_entry'  => 'document_beta.txt',
25    ];
26
27    echo "--- ソート前の配列の状態 ---\n";
28    print_r($data);
29
30    // natsort() を使って配列の値を自然順でソートします。
31    // 関数は配列自体を直接変更し、成功した場合は true、失敗した場合は false を返します。
32    $success = natsort($data);
33
34    if ($success) {
35        echo "\n--- natsort() でソート後の配列の状態 ---\n";
36        echo "  (値は自然順に並べ替えられ、元の文字列キーは維持されます)\n";
37        print_r($data);
38    } else {
39        echo "\n配列のソートに失敗しました。\n";
40    }
41
42    // 参考: 数値キーの配列で natsort() を使うと、キーは再インデックスされます。
43    // 例えば、[0 => 'document10.txt', 1 => 'document2.txt'] が
44    // natsort() 後に [0 => 'document2.txt', 1 => 'document10.txt'] となります。
45}
46
47// 関数を実行して動作を確認します。
48demonstrateNatsortBehavior();
49

natsort関数は、PHPにおいて配列の値を「自然順アルゴリズム」に基づいてソートするために使用されます。このアルゴリズムは、特にファイル名など数字を含む文字列を扱う際に非常に便利です。例えば、「document1.txt」の次に「document2.txt」、そして「document10.txt」といったように、数字の部分を数値として認識し、人間が直感的に理解しやすい順序で並べ替えることができます。これは、一般的な文字列ソート(辞書順ソート)で「document10.txt」が「document2.txt」より前に来てしまう挙動とは異なります。

この関数は、引数としてソートしたい配列を「参照渡し」で受け取ります。そのため、渡された配列自体が直接変更されます。処理が成功した場合はtrueを、何らかの理由で失敗した場合はfalseを戻り値として返します。

natsortは配列の「値」をソートしますが、連想配列(文字列キーを持つ配列)の場合、ソート後も元のキーとその値の関連は維持されます。しかし、数値キーを持つ配列に対して使用した場合は、ソート後にキーが0から始まる連番に再インデックスされますので、この挙動の違いには注意が必要です。サンプルコードでは、ファイル名のような文字列を含む連想配列をnatsortでソートし、値が自然順に並び替えられながらも、元の文字列キーが維持される様子を確認できます。

natsort関数は、配列の「値」を自然順アルゴリズムでソートします。この関数は引数に渡された配列自体を直接変更する「参照渡し」であり、新しい配列を返すわけではありません。戻り値はソート処理が成功したか失敗したかを示す真偽値です。特に重要な点として、連想配列(文字列キーを持つ配列)の場合、ソート後もキーと値の関連性は維持されます。つまり、値の並び替えに伴ってキーも移動します。しかし、数値キーを持つ配列に対して使用した場合、ソート後にキーは0から始まる連番に再インデックスされますので、元の数値キーに依存する処理を行う際は注意が必要です。

PHP natsortで多次元配列を自然順ソートする

1<?php
2
3/**
4 * PHPのnatsort関数を使った多次元配列内の自然順ソートのデモンストレーション。
5 *
6 * natsortは配列の値を「自然順」(natural order)でソートします。
7 * これは、文字列を数字として扱い、「file1.txt」「file2.txt」「file10.txt」のように
8 * 人間が認識する順序でソートするアルゴリズムです。通常の辞書順ソートでは、
9 * 「file1.txt」「file10.txt」「file2.txt」となってしまいます。
10 *
11 * この関数は、多次元配列内の各サブ配列にnatsortを適用する方法を示します。
12 */
13function demonstrateNatsortWithMultidimensionalArray(): void
14{
15    // ソート対象となる多次元配列の例
16    $fileGroups = [
17        'category_A' => [
18            'item10.txt',
19            'item2.txt',
20            'item1.txt',
21            'document_2.pdf',
22            'document_10.pdf',
23            'document_1.pdf',
24        ],
25        'category_B' => [
26            'log_b_1.log',
27            'log_b_10.log',
28            'log_b_2.log',
29        ],
30        'category_C' => [
31            'report_Z.csv',
32            'report_A.csv',
33            'data_10.json',
34            'data_2.json',
35            'data_1.json',
36        ],
37    ];
38
39    echo "--- ソート前の配列の状態 ---\n";
40    print_r($fileGroups);
41
42    // メイン配列を反復処理し、各サブ配列にnatsortを適用します。
43    // `&$group` の '&' は、ループ内で $group に加えた変更が元の $fileGroups 配列に直接反映されることを意味します。
44    foreach ($fileGroups as $key => &$group) {
45        echo "\n'{$key}' カテゴリのサブ配列を自然順でソート中...\n";
46        // natsortは配列をその場で(インプレースで)ソートし、成功した場合にtrueを返します。
47        $success = natsort($group); 
48        if ($success) {
49            echo "'{$key}' は正常にソートされました。\n";
50        } else {
51            echo "'{$key}' のソートに失敗しました。\n";
52        }
53    }
54    // 参照を使ったループの後は、意図しない挙動を防ぐために参照を解除することが推奨されます。
55    unset($group); 
56
57    echo "\n--- natsort適用後の配列の状態 ---\n";
58    print_r($fileGroups);
59
60    echo "\n--- natsortの単一配列への適用例(比較用) ---\n";
61    $simpleArray = ['photo10.jpg', 'photo2.jpg', 'photo1.jpg'];
62    echo "ソート前の単一配列: ";
63    print_r($simpleArray);
64    natsort($simpleArray); // natsortは元の配列を自然順で並べ替えます
65    echo "ソート後の単一配列: ";
66    print_r($simpleArray);
67}
68
69// 上記の関数を実行し、natsortのデモンストレーションを開始します。
70demonstrateNatsortWithMultidimensionalArray();
71

natsort関数は、配列の要素を人間が認識しやすい「自然順」でソートするためのPHP関数です。これは、数字を含む文字列を数字として適切に扱い、例えば「item1.txt」「item2.txt」「item10.txt」のように並べ替えることを意味します。一般的な辞書順ソートで起こる「item1.txt」「item10.txt」「item2.txt」といった不自然な順序を防ぐことができます。

この関数の引数array &$arrayは、ソートしたい配列を参照渡しで受け取ります。そのため、natsort関数が実行されると、呼び出し元の配列自体が直接変更され(インプレースソート)、並べ替えられた状態になります。戻り値はbool型で、ソート処理が成功した場合はtrue、何らかの理由で失敗した場合はfalseを返します。

サンプルコードでは、多次元配列内の各サブ配列に対してnatsortを適用する方法を具体的に示しています。foreachループでサブ配列を&$groupのように参照渡しで取得し、その$groupに対してnatsortを呼び出すことで、元の多次元配列内の各サブ配列が自然順にソートされる様子を確認できます。ループで参照を使った後は、意図しない影響を避けるためunset($group)で参照を解除することが推奨されます。

natsort関数は、引数で渡された配列を「自然順」に直接(インプレースで)並べ替えます。新しい配列は返されず、ソートの成否が真偽値で戻ります。

多次元配列全体を一度にソートすることはできません。サンプルコードのように、foreachループで各サブ配列を&$groupのように参照渡しで取り出し、個別にnatsortを適用してください。これにより、元の多次元配列のサブ配列が直接変更されます。

foreachで参照を使った後は、意図せぬ変数変更を防ぐため、ループの最後にunset($group)で参照を解除することを強くお勧めします。

関連コンテンツ

【PHP8.x】natsort関数の使い方 | いっしー@Webエンジニア