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

作成日: 更新日:

natcasesort関数は、配列の要素を自然順アルゴリズムに基づいて、大文字小文字を区別せずにソートする関数です。

プログラミングにおいて文字列をソートする場合、通常は文字コード順に並べられます。しかし、例えばファイル名を"file1.txt", "file10.txt", "file2.txt"のようにソートしようとすると、通常の辞書順では"file1.txt", "file10.txt", "file2.txt"となってしまい、数字の10が2よりも前に来てしまうことがあります。natcasesort関数が採用する自然順アルゴリズムは、文字列中の数字部分を数値として認識し、"file1.txt", "file2.txt", "file10.txt"といった、人間が直感的に理解しやすい順序で並べ替えます。

さらに、この関数は大文字と小文字を区別しません。例えば「Apple」と「apple」は同じものとして扱われ、ソート順に影響を与えません。この機能により、ファイル名リストやバージョン番号など、数字を含む文字列を適切に整理したい場合に特に便利です。配列のキーと値の関連性はソート後も維持されますので、要素の並び順だけが変わります。ソートが成功した場合はブーリアン値のtrueを、失敗した場合はfalseを返します。この関数は、引数として渡された配列自体を直接変更(インプレースソート)しますので、元の配列の内容が書き換えられる点にご注意ください。

基本的な使い方

構文(syntax)

<?php
$array = ['img1.png', 'img10.png', 'img2.png', 'IMG9.png', 'IMG1.png'];
natcasesort($array);
print_r($array);
?>

引数(parameters)

array &$array

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

戻り値(return)

bool

配列の要素を、大文字・小文字を区別せずに自然順でソートします。ソートが成功した場合は true を、失敗した場合は false を返します。

サンプルコード

natcasesort関数で配列を自然順ソートする

<?php

/**
 * natcasesort() 関数の動作をデモンストレーションする関数。
 *
 * この関数は、ファイル名のような文字列の配列を自然順アルゴリズムと
 * 大文字小文字を区別しない比較でソートします。
 *
 * natcasesort() は配列自体を変更し、成功した場合は true、失敗した場合は false を返します。
 */
function demonstrateNatcasesort(): void
{
    // ソート対象の文字列配列を定義します。
    // 大文字小文字の違いや、数字の文字列が含まれていることに注目してください。
    $items = [
        'img10.png',
        'img1.png',
        'IMG2.PNG',
        'img20.png',
        'file_test.txt',
        'file_Test_1.txt',
        'file_test_10.txt',
    ];

    echo "--- ソート前の配列 ---\n";
    print_r($items);

    // natcasesort() を使用して配列をソートします。
    // この関数は配列を直接変更します(参照渡し)。
    $isSorted = natcasesort($items);

    if ($isSorted) {
        echo "\n--- natcasesort でソート後の配列 ---\n";
        print_r($items);
    } else {
        echo "\nソートに失敗しました。\n";
    }

    // 期待されるソート順序 (大文字小文字を区別せず、数字の並びを自然に処理):
    // file_Test_1.txt
    // file_test.txt
    // file_test_10.txt
    // img1.png
    // IMG2.PNG
    // img10.png
    // img20.png
}

// demonstrateNatcasesort 関数を実行します。
demonstrateNatcasesort();

?>

natcasesort関数は、PHPで配列の要素を自然順アルゴリズムに基づいてソートする関数です。特に、ファイル名のように数字を含む文字列を、人間が直感的に理解する順序で並べ替える際に非常に役立ちます。この関数は大文字と小文字を区別せずに比較を行うため、例えば「IMG2.PNG」と「img2.png」は同じものとして扱われ、数字部分も「1」「2」「10」といった順に正しく並べ替えられます。

引数にはソート対象となる配列を&$arrayとして指定します。この引数は参照渡しのため、natcasesort関数は渡された配列そのものを直接変更し、新しい配列を返すわけではありません。処理が成功した場合はtrueを返し、失敗した場合はfalseを返します。

サンプルコードでは、img1.pngimg10.pngIMG2.PNGといった文字列を含む配列をソートしています。natcasesortを適用することで、ソート前は数字の大小や大文字小文字が混在していても、「img1.png」の次に「IMG2.PNG」、そして「img10.png」が続くように、自然な順序で並び替えられることが確認できます。これにより、ファイルリストなどの表示順序を、より分かりやすくユーザーフレンドリーに整えることができます。

natcasesort関数は、引数で渡された配列の要素を、大文字小文字を区別せず、かつ数字部分を自然な順序でソートします。最も重要な注意点は、この関数が引数として渡した配列自体を直接変更する点です。ソートされた結果は戻り値ではなく、元の配列に反映されますので、元の配列の内容を保持したい場合は事前に複製する必要があります。

また、関数はソート処理が成功した場合はtrueを、失敗した場合はfalseを戻り値として返します。必ずこの戻り値を確認し、ソートが正しく行われたかを判断してください。これにより、予期せぬエラーを防ぎ、より堅牢なコードになります。

PHP natcasesortで降順ソートする

<?php

/**
 * 指定された配列を自然順序で大文字小文字を区別せずに降順にソートします。
 *
 * natcasesort() 関数は、配列の要素を「自然順序」(人間が期待する順序、例: img1.png, img2.png, img10.png)
 * で、かつ大文字小文字を区別せずに昇順にソートします。
 * この関数では、その結果を array_reverse() で反転させることで、降順ソートを実現しています。
 *
 * @param array<string> &$array ソートする文字列の配列。参照渡しされるため、元の配列が直接変更されます。
 * @return bool 常に true を返します(natcasesort() の戻り値に倣います)。
 */
function sortNaturallyCaseInsensitiveDescending(array &$array): bool
{
    // 1. natcasesort() を使用して、まず配列を自然順序、大文字小文字を区別せずに昇順にソートします。
    // この関数は、元の配列を直接変更します。
    natcasesort($array);

    // 2. array_reverse() を使用して、昇順ソートされた配列の要素順序を反転させ、降順にします。
    // array_reverse() は新しい配列を返すため、元の配列変数 ($array) に結果を再代入する必要があります。
    // 第二引数 (preserve_keys) はデフォルトで false なので、数値キーはリセットされます。
    // この例では文字列の配列なので、キーのリセットは問題ありません。
    $array = array_reverse($array);

    // natcasesort() の仕様に合わせて、成功時は常に true を返します。
    return true;
}

// --- 使用例 ---

// ソート対象となるファイル名や文字列の配列を準備します。
$items = [
    "file10.txt",
    "file1.txt",
    "FILE2.txt",
    "Image_A.jpg",
    "image_b.jpg",
    "1_document.pdf",
    "2_document.pdf",
    "10_document.pdf",
];

echo "--- ソート前の配列 ---" . PHP_EOL;
print_r($items);

// 配列を自然順序、大文字小文字を区別せずに降順にソートします。
sortNaturallyCaseInsensitiveDescending($items);

echo PHP_EOL . "--- 降順ソート後の配列 (natcasesort + array_reverse) ---" . PHP_EOL;
print_r($items);

// 別のデータでの例
$versions = [
    "v1.0.10",
    "V1.0.1",
    "v2.0.0",
    "v1.0.2",
    "v10.0.0",
];

echo PHP_EOL . "--- ソート前のバージョン配列 ---" . PHP_EOL;
print_r($versions);

sortNaturallyCaseInsensitiveDescending($versions);

echo PHP_EOL . "--- 降順ソート後のバージョン配列 ---" . PHP_EOL;
print_r($versions);

?>

このサンプルコードは、PHPのnatcasesort関数とarray_reverse関数を組み合わせて、配列の要素を自然順序(例: file1.txt, file2.txt, file10.txt のような人間が期待する順番)で、大文字小文字を区別せずに降順にソートする方法を示しています。

内部では、まずnatcasesort関数を使って配列を自然順序、大文字小文字を区別せずに昇順にソートします。この関数は、引数で渡された配列そのものを直接変更します。次に、array_reverse関数を使って、昇順にソートされた配列の要素の並び順を反転させ、降順にします。array_reverse関数は新しい配列を返すため、その結果を元の配列変数に再代入することで、最終的な降順ソートを実現しています。

sortNaturallyCaseInsensitiveDescending関数は、ソート対象の配列を&$arrayとして参照渡しで受け取ります。そのため、関数内でソート処理を行うと、元の配列が直接変更されます。戻り値は、natcasesort関数に倣い、処理が成功したことを示すtrueを常に返します。この機能は、ファイル名、バージョン番号、商品コードなど、数値と文字列が混在し、人間が直感的に理解しやすい順序で並べたい場合に特に役立ちます。

このコードはnatcasesort関数が引数の配列を直接変更する「参照渡し」である点に注意が必要です。元の配列を保持したい場合は、事前にコピーを作成してください。natcasesortは常にtrueを返し、ソートの成否をこの戻り値で判断できません。降順ソートは、natcasesortで昇順ソートした後にarray_reverseで反転させることで実現しています。array_reverseは新しい配列を返すため、元の変数への再代入が必須です。また、array_reverseはデフォルトで数値キーをリセットします。連想配列のキーや数値キーに意味がある場合は、キーを維持するかどうか検討してください。各関数の動作を理解し、安全にご利用ください。

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