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

【PHP8.x】ArrayIterator::natsort()メソッドの使い方

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

作成日: 更新日:

基本的な使い方

natsortメソッドは、ArrayIteratorオブジェクトが内部で保持している配列を、自然順アルゴリズムを用いてソートを実行するメソッドです。このソート方法は、文字列に含まれる数値を文字としてではなく数値の大きさとして比較するため、人間が直感的に並び替える順序と同じ結果を得られます。例えば、「img2.png」、「img10.png」、「img1.png」という要素を持つ配列をソートする場合、通常の文字列ソートでは「img1.png」、「img10.png」、「img2.png」の順になりますが、natsortメソッドを使用すると「img1.png」、「img2.png」、「img10.png」という期待通りの順序に並び替えられます。このメソッドは、元の配列のキーと値の関連性を維持したままソートを行います。また、ソートはイテレータが指す配列そのものを直接変更する破壊的な操作であり、メソッド自体の返り値はありません。ファイル名やバージョン番号など、アルファベットと数字が混在したデータを直感的な順序で扱いたい場合に非常に便利なメソッドです。

構文(syntax)

1<?php
2// 元となる配列を定義します
3$array = ['img12.png', 'img10.png', 'img2.png', 'img1.png'];
4
5// 配列からArrayIteratorオブジェクトを作成します
6$iterator = new ArrayIterator($array);
7
8// natsort()メソッドを呼び出して、"自然順"で要素をソートします
9$iterator->natsort();
10
11// ソート後のイテレータの内容をループして表示します
12foreach ($iterator as $key => $value) {
13    echo "{$key}: {$value}\n";
14}
15?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP ArrayIterator::natsort() で自然順ソートする

1<?php
2
3/**
4 * ArrayIterator::natsort() の使用例を示します。
5 *
6 * この関数は、配列の値を「自然順アルゴリズム」に基づいてソートします。
7 * これは、人間が直感的に数字をソートする方法 (例: "item10" は "item2" の後に来る) に似ています。
8 *
9 * システムエンジニアを目指す初心者の方へ:
10 * 通常のアルファベット順ソートでは "item10" が "item2" の前に来てしまいますが、
11 * natsort はファイル名やバージョン番号のような文字列を自然な順序で並べたい場合に非常に便利です。
12 */
13function demonstrateArrayIteratorNatsort(): void
14{
15    // 自然順ソートで違いが分かりやすいように、数字を含む文字列の配列を準備します。
16    $items = [
17        "image1.png",
18        "image10.png",
19        "image2.png",
20        "image100.png",
21        "image20.png",
22        "image.png",
23    ];
24
25    echo "--- ソート前 ---" . PHP_EOL;
26    foreach ($items as $item) {
27        echo $item . PHP_EOL;
28    }
29    echo PHP_EOL;
30
31    // ArrayIterator オブジェクトを作成し、元の配列を渡します。
32    $arrayIterator = new ArrayIterator($items);
33
34    // ArrayIterator の natsort メソッドを呼び出し、自然順でソートします。
35    // このメソッドは ArrayIterator 内部の配列を直接変更します。
36    $arrayIterator->natsort();
37
38    echo "--- ArrayIterator::natsort() でソート後 ---" . PHP_EOL;
39    // ソートされた要素を ArrayIterator から取得して表示します。
40    foreach ($arrayIterator as $item) {
41        echo $item . PHP_EOL;
42    }
43    echo PHP_EOL;
44
45    echo "--- 参考: 通常の sort() (アルファベット順) との比較 ---" . PHP_EOL;
46    // 参考として、PHP の標準関数である sort() を使用した場合の結果も示します。
47    // sort() はアルファベット順ソートであり、"image10" が "image2" の前に来ます。
48    $itemsForComparison = [
49        "image1.png",
50        "image10.png",
51        "image2.png",
52        "image100.png",
53        "image20.png",
54        "image.png",
55    ];
56    sort($itemsForComparison);
57    foreach ($itemsForComparison as $item) {
58        echo $item . PHP_EOL;
59    }
60    echo PHP_EOL;
61}
62
63// 関数の実行
64demonstrateArrayIteratorNatsort();
65

PHPのArrayIterator::natsort()メソッドは、配列の要素を「自然順アルゴリズム」に基づいてソートするために使用されます。これは、人間がファイル名やバージョン番号などを見る際に直感的に期待する順序でデータを並べ替える方法です。例えば、「item2」の次に「item10」が来るように、数字部分を数値として比較してソートします。このメソッドはArrayIteratorクラスに属し、ソートしたい配列をArrayIteratorオブジェクトとして扱う際に利用します。

サンプルコードでは、まず数字を含むファイル名のような文字列配列を準備し、その配列を元にArrayIteratorのインスタンスを作成しています。次に、作成した$arrayIteratorオブジェクトのnatsort()メソッドを呼び出すことで、内部の配列が自然順に並べ替えられます。このメソッドは引数を必要とせず、また戻り値もありませんが、ArrayIteratorオブジェクトが内部で保持する配列を直接変更します。通常のアルファベット順ソートでは「image10.png」が「image2.png」の前に来てしまいますが、natsort()を使用すると「image2.png」の後に「image10.png」が来るため、特にファイルリストの表示などで非常に便利です。

ArrayIterator::natsort()は、ArrayIteratorオブジェクトに格納された配列を「自然順アルゴリズム」に基づいてソートするメソッドです。通常のアルファベット順ソートとは異なり、数字を含む文字列(例: "image2.png"の後に"image10.png")を人間が直感的に理解する順序で並べたい場合に非常に便利です。このメソッドは、ArrayIterator内部の配列を直接変更し、戻り値はありません。ソート後には配列のキーが再割り当てされますので、キーに依存する処理を行う際には注意が必要です。標準のnatsort()関数とは異なり、ArrayIteratorのインスタンスに対してのみ使用できます。

ArrayIterator::natsort()でオブジェクト配列を自然順ソートする

1<?php
2
3/**
4 * 製品情報を表すクラス。
5 * ArrayIterator::natsort() メソッドがオブジェクトを文字列として扱う際に使用するため、
6 * __toString() マジックメソッドを実装しています。
7 * これにより、オブジェクトが文字列としてどのように振る舞うかを定義できます。
8 */
9class Product
10{
11    public string $name;
12    public int $id;
13
14    /**
15     * Product クラスのコンストラクタ。
16     *
17     * @param string $name 製品の名前。
18     * @param int $id 製品のID。
19     */
20    public function __construct(string $name, int $id)
21    {
22        $this->name = $name;
23        $this->id = $id;
24    }
25
26    /**
27     * オブジェクトを文字列にキャストする際の振る舞いを定義します。
28     * ArrayIterator::natsort() は、内部的に各要素を文字列に変換して比較を行います。
29     * そのため、このメソッドが返す文字列がソートの基準となります。
30     *
31     * @return string 製品の名前。
32     */
33    public function __toString(): string
34    {
35        return $this->name;
36    }
37}
38
39// サンプルデータとして、Productオブジェクトの配列を作成します。
40// ファイル名のような文字列を想定し、自然順ソートで期待される並びになるように配置します。
41$products = [
42    new Product('item_10.png', 10),
43    new Product('item_2.png', 2),
44    new Product('item_1.png', 1),
45    new Product('item_20.png', 20),
46    new Product('item_3.png', 3),
47];
48
49echo "--- ソート前の製品リスト ---\n";
50foreach ($products as $product) {
51    echo $product->name . "\n";
52}
53echo "\n";
54
55// ArrayIterator のインスタンスを作成し、Productオブジェクトの配列を渡します。
56// ArrayIterator は配列のように反復処理できるオブジェクトです。
57$iterator = new ArrayIterator($products);
58
59// natsort() メソッドを呼び出し、イテレータが保持する配列の要素を
60// 「自然な順序」(アルファベット順ではなく、数値部分を数値として扱う)でソートします。
61// この例では、Productオブジェクトの __toString() メソッドが返す文字列に基づいてソートされます。
62$iterator->natsort();
63
64// ソート後の結果を表示します。
65echo "--- natsort() でソート後の製品リスト ---\n";
66// イテレータはソートされた順序で要素を提供します。
67foreach ($iterator as $product) {
68    echo $product->name . "\n";
69}
70
71/*
72期待される出力:
73--- ソート前の製品リスト ---
74item_10.png
75item_2.png
76item_1.png
77item_20.png
78item_3.png
79
80--- natsort() でソート後の製品リスト ---
81item_1.png
82item_2.png
83item_3.png
84item_10.png
85item_20.png
86*/
87
88?>

ArrayIterator::natsort() メソッドは、PHP 8 の ArrayIterator クラスに属するメソッドで、イテレータが保持する要素を「自然な順序」でソートします。このメソッドには引数がなく、戻り値もありません。代わりに、ArrayIteratorオブジェクトの内部にある配列の要素の順序が直接変更されます。

ArrayIterator は、配列のように反復処理(ループ)ができるオブジェクトです。この natsort() メソッドを呼び出すと、例えば「item_1.png」「item_10.png」「item_2.png」のような文字列が、通常のアルファベット順ソートでは「item_1.png」「item_10.png」「item_2.png」となるのに対し、数値を数値として正しく認識し、「item_1.png」「item_2.png」「item_10.png」という期待される順序に並び替えます。

サンプルコードでは、Productという独自のオブジェクトを要素とする配列をソートしています。オブジェクトの配列を natsort() でソートする場合、PHPは各オブジェクトを文字列として扱おうとします。そのため、Productクラスに __toString() マジックメソッドを実装しています。このメソッドが返す文字列(ここでは製品名 $this->name)がソートの比較基準となり、natsort() はこの文字列に基づいて自然な順序で要素を並び替えます。これにより、製品名がファイル名のように番号を含む場合でも、直感的に理解しやすい順序にソートされた結果が得られます。

このサンプルコードでオブジェクトの配列を自然順ソートする際は、いくつか注意点があります。まず、ArrayIterator::natsort()メソッドは、内部的に各要素を文字列に変換して比較を行います。そのため、オブジェクトの配列をソートする際は、__toString()マジックメソッドを実装し、ソートの基準としたいプロパティ(この例ではname)が文字列として返されるように定義する必要があります。これが無いと、期待通りのソート結果にはなりません。

次に、natsort()ArrayIteratorクラスのメソッドとして提供され、直接配列に適用する関数ではありません。元の配列をArrayIteratorのインスタンスに渡して利用します。また、このメソッドは引数も戻り値もなく、元のイテレータが保持する配列が直接変更される「インプレースソート」である点もご留意ください。自然順ソートは、数値部分を数値として比較するため、ファイル名などの数字を含む文字列を人間が見て自然な順序で並べたい場合に非常に役立ちます。

ArrayIterator::natsortで多次元配列の要素を自然順ソートする

1<?php
2
3/**
4 * ArrayIterator::natsort を使用して、多次元配列の各サブ配列の要素を自然順序でソートします。
5 *
6 * この関数は、システムエンジニアを目指す初心者向けに、
7 * ArrayIterator クラスの natsort メソッドの具体的な使い方を示します。
8 * natsort は、"自然順序" (例えば、"img10.png" が "img2.png" の後に来るように) で文字列をソートするのに役立ちます。
9 *
10 * @return void
11 */
12function sortMultidimensionalArrayElementsNaturally(): void
13{
14    // 多次元配列の例: 各カテゴリ(キー)が、ファイル名のリスト(値)を持つ
15    $multidimensionalArray = [
16        'images' => [
17            'image10.png',
18            'image2.png',
19            'image1.png',
20            'image_thumb.png',
21        ],
22        'documents' => [
23            'document_final.pdf',
24            'document10.pdf',
25            'document2.pdf',
26            'document1.pdf',
27        ],
28        'archive' => [
29            'data_v10.zip',
30            'data_v2.zip',
31            'data_v1.zip',
32        ],
33    ];
34
35    echo "--- ソート前の多次元配列 ---\n";
36    foreach ($multidimensionalArray as $category => $items) {
37        echo sprintf("カテゴリ '%s': %s\n", $category, implode(', ', $items));
38    }
39    echo "\n";
40
41    $sortedMultidimensionalArray = [];
42
43    // 多次元配列の各サブ配列をループ処理します。
44    // ArrayIterator::natsort は、ArrayIterator がラップしている単一の配列の値をソートするため、
45    // 各サブ配列に対して個別に適用する必要があります。
46    foreach ($multidimensionalArray as $category => $items) {
47        // 現在のサブ配列を ArrayIterator でラップします。
48        $iterator = new ArrayIterator($items);
49
50        // natsort メソッドを呼び出して、ArrayIterator 内の配列の要素を自然順序でソートします。
51        // このメソッドは元の配列を直接変更し、戻り値はありません (void)。
52        $iterator->natsort();
53
54        // ソートされた配列を取得して、新しい多次元配列に格納します。
55        $sortedMultidimensionalArray[$category] = $iterator->getArrayCopy();
56    }
57
58    echo "--- ArrayIterator::natsort でソート後の多次元配列 ---\n";
59    foreach ($sortedMultidimensionalArray as $category => $items) {
60        echo sprintf("カテゴリ '%s': %s\n", $category, implode(', ', $items));
61    }
62}
63
64// 関数を実行して結果を表示します。
65sortMultidimensionalArrayElementsNaturally();

PHPのArrayIterator::natsortメソッドは、ArrayIteratorクラスのインスタンスが保持する配列の要素を「自然順序」でソートするための機能です。PHP 8で利用できます。

このメソッドは引数を必要とせず、また戻り値もありません。代わりに、ArrayIteratorオブジェクト内部で管理している配列の要素を直接変更(ソート)します。自然順序とは、例えば"file2.txt"の次に"file10.txt"が来るように、文字列内の数値部分を適切に考慮して並べ替える方式を指します。これは、"file10.txt"が"file2.txt"の前に来てしまうような通常の文字列ソートとは異なります。

提供されたサンプルコードは、多次元配列内の各サブ配列の要素を自然順序でソートする具体的な例を示しています。まず、対象となるサブ配列をArrayIteratorのコンストラクタに渡してインスタンスを作成します。次に、そのArrayIteratorインスタンスに対してnatsort()メソッドを呼び出すことで、内部の配列が自然順序でソートされます。ソートされた結果は、getArrayCopy()メソッドを使って取得し、新しい多次元配列として構築し直しています。この方法は、多次元配列の各レベルのソートにnatsortを適用する際の効果的なアプローチを示しています。

ArrayIterator::natsortは、多次元配列全体ではなく、ArrayIteratorがラップする単一の配列を自然順でソートします。そのため、多次元配列の各サブ配列をソートするには、サブ配列ごとにArrayIteratorを作成し、個別にnatsortを適用する必要があります。このメソッドはソート結果を戻り値として返さず、ArrayIterator内部の配列が直接変更されますので、ソート後の配列を取得する際はgetArrayCopy()を使用します。natsortは、"image2.png"、"image10.png"のように数字を含む文字列を、人間が直感的に理解しやすい自然な順序でソートする際に特に有用であり、通常の辞書順ソートとは異なる振る舞いをすることを知っておくと、意図しないソートを防ぐことができます。

関連コンテンツ