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

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

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

作成日: 更新日:

基本的な使い方

『natsortメソッドは、ArrayObjectの要素を「自然順アルゴリズム」を使用して並べ替えるメソッドです。このメソッドは、ファイル名やバージョン番号のように、文字列の中に数字が含まれている要素を、人間が直感的に期待する順序でソートする際に非常に役立ちます。例えば、["img12.png", "img10.png", "img2.png"] という要素を持つ配列に対して、通常の辞書順ソートでは ["img10.png", "img12.png", "img2.png"] という順序になります。しかし、natsortメソッドを呼び出すと、文字列中の数値を数値として解釈して比較するため、["img2.png", "img10.png", "img12.png"] という、より自然な順序に並べ替えられます。このソート処理では、各要素のキーと値の関連性は維持されるため、連想配列にも安全に使用できます。また、このメソッドはアルファベットの大文字と小文字を区別してソートを実行します。ソートはArrayObjectインスタンス自体を直接変更し、成功した場合には true を返します。

構文(syntax)

1public ArrayObject::natsort(): true

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool

ArrayObject の要素を自然順でソートした結果を返します。ソートが成功した場合は true を、失敗した場合は false を返します。

サンプルコード

PHP ArrayObject natsort オブジェクトをソートする

1<?php
2
3/**
4 * 自然順ソートの対象となるオブジェクトのクラス。
5 * ArrayObject::natsort() がオブジェクトを文字列として比較するために、
6 * __toString() メソッドを実装しています。
7 */
8class SortableItem
9{
10    private string $name;
11
12    /**
13     * @param string $name アイテムの名前(ソートの基準となる文字列)
14     */
15    public function __construct(string $name)
16    {
17        $this->name = $name;
18    }
19
20    /**
21     * オブジェクトを文字列として表現するマジックメソッド。
22     * ArrayObject::natsort() は、このメソッドの戻り値を使ってオブジェクトを比較します。
23     *
24     * @return string このオブジェクトの名前
25     */
26    public function __toString(): string
27    {
28        return $this->name;
29    }
30
31    /**
32     * アイテムの名前を取得します。
33     *
34     * @return string アイテムの名前
35     */
36    public function getName(): string
37    {
38        return $this->name;
39    }
40}
41
42/**
43 * ArrayObject::natsort() メソッドを使って、__toString() を持つオブジェクトの配列を
44 * 自然順ソートするデモンストレーション関数。
45 */
46function demonstrateArrayObjectNatsortWithObjects(): void
47{
48    // ソートしたい SortableItem オブジェクトの配列を作成
49    $items = [
50        new SortableItem('photo1.jpg'),
51        new SortableItem('photo10.jpg'),
52        new SortableItem('photo2.jpg'),
53        new SortableItem('document_v2.txt'),
54        new SortableItem('document_v1.txt'),
55    ];
56
57    echo "--- ソート前のデータ ---\n";
58    foreach ($items as $item) {
59        echo $item->getName() . "\n";
60    }
61
62    // ArrayObject にオブジェクトの配列を格納
63    $arrayObject = new ArrayObject($items);
64
65    // ArrayObject::natsort() を呼び出して自然順ソートを実行
66    // SortableItem クラスの __toString() メソッドが利用され、
67    // オブジェクトの名前(文字列)に基づいて自然順にソートされます。
68    // 戻り値は bool ですが、ArrayObject 自体が変更されます。
69    $arrayObject->natsort();
70
71    echo "\n--- ソート後のデータ (ArrayObject::natsort()) ---\n";
72    foreach ($arrayObject as $item) {
73        echo $item->getName() . "\n";
74    }
75}
76
77// デモンストレーション関数の実行
78demonstrateArrayObjectNatsortWithObjects();

このPHPサンプルコードは、ArrayObjectクラスのnatsort()メソッドを使って、オブジェクトの配列を自然順ソートする方法を示しています。自然順ソートとは、「photo1.jpg」「photo10.jpg」「photo2.jpg」のような文字列を、数値部分を正しく認識して「photo1.jpg」「photo2.jpg」「photo10.jpg」の順に並べ替える方法です。

コードでは、ソート対象となるSortableItemクラスが定義されており、このクラスは__toString()マジックメソッドを実装しています。ArrayObject::natsort()は、オブジェクトを直接比較するのではなく、各オブジェクトの__toString()メソッドが返す文字列を利用してソートを行います。そのため、オブジェクトの配列をnatsort()でソートする際には、この__toString()の実装が非常に重要になります。

まず、ソートしたいSortableItemオブジェクトの配列を作成し、それをArrayObjectのインスタンスに格納します。その後、引数なしで$arrayObject->natsort();を呼び出すことで、自然順ソートが実行されます。このメソッドはArrayObjectインスタンス自身の中身を直接変更します。戻り値はソートが成功したかどうかを示す真偽値(bool)ですが、主な目的は配列要素の並び替えです。ソート後の結果は、期待通りに自然な順序で出力されることを確認できます。

ArrayObject::natsort()でオブジェクトをソートする場合、ソート対象のオブジェクトには__toString()メソッドの実装が必須です。このメソッドがないと、ソートが正しく行われないか、エラーになる可能性がありますのでご注意ください。

このメソッドは、元のArrayObjectの要素の並び順を直接変更します(インプレースソート)。ソート前のデータを保持したい場合は、事前にArrayObjectを複製してください。

自然順ソートは、「file1.txt」と「file10.txt」のように数字を含む文字列を人間が直感的に理解できる順序で並べ替える際に特に有効です。

ArrayObject::natsort()で値の自然順ソート

1<?php
2
3/**
4 * ArrayObject::natsort() メソッドの使用例。
5 * 配列の値を自然順アルゴリズムでソートします。
6 * キーと値の関連は維持されます。
7 */
8function demonstrateNatsortByKey(): void
9{
10    // ソート対象の連想配列を準備します。
11    // キーは文字列、値も文字列で、ファイル名のような連番を含むケースを想定します。
12    $data = [
13        'id_1' => 'image10.png',
14        'id_2' => 'image1.png',
15        'id_3' => 'image2.png',
16        'id_4' => 'image_a.jpg',
17        'id_5' => 'image_b.jpg',
18    ];
19
20    // ArrayObject のインスタンスを作成し、上記のデータを渡します。
21    $arrayObject = new ArrayObject($data);
22
23    echo "--- ソート前の状態 ---" . PHP_EOL;
24    // ソート前の ArrayObject の内容をキーと値のペアで表示します。
25    foreach ($arrayObject as $key => $value) {
26        echo "キー: '{$key}', 値: '{$value}'" . PHP_EOL;
27    }
28
29    // ArrayObject::natsort() メソッドを呼び出して、値を自然順でソートします。
30    // このメソッドは、ArrayObject 内の配列の「値」をソートし、
31    // ソート後も元の「キー」と「値」の関連を維持します。
32    // したがって、「by key」というキーワードの意図を
33    // 「キーと値の関連を保ちながら値をソートする」と解釈し、対応するものです。
34    $result = $arrayObject->natsort();
35
36    echo PHP_EOL . "--- ソート後の状態 (ArrayObject::natsort() による値の自然順ソート) ---" . PHP_EOL;
37    // ソート後の ArrayObject の内容を表示します。
38    // 値が「image1.png」, 「image2.png」, 「image10.png」の順になっていることに注目してください。
39    foreach ($arrayObject as $key => $value) {
40        echo "キー: '{$key}', 値: '{$value}'" . PHP_EOL;
41    }
42
43    echo PHP_EOL . "ソート操作の成功: " . ($result ? 'はい' : 'いいえ') . PHP_EOL;
44}
45
46// 関数を実行してデモンストレーションを開始します。
47demonstrateNatsortByKey();

PHPのArrayObject::natsort()は、ArrayObjectインスタンスが保持する配列の値を自然順アルゴリズムでソートするメソッドです。これは、通常の文字列ソートとは異なり、「image1.png」「image2.png」「image10.png」のような文字列を、数字部分を数値として認識し、人間が期待する順序に並べ替える際に非常に役立ちます。

このメソッドの重要な特徴は、値をソートする際に、元のキーと値の関連性を維持することです。そのため、連想配列のようにキーと値がペアになっているデータを扱う場合でも、ソートによってキーと値のペアが崩れる心配がありません。サンプルコードでは、ファイル名のような文字列の連想配列をArrayObjectに格納し、natsort()を適用することで、値が「image1.png」「image2.png」「image10.png」という自然な順序に並べ替えられる様子を示しています。ソート後も、元のキーと新しい値の関連は正しく保たれます。

このメソッドは引数を取らず、ソート操作が成功した場合はブール値のtrueを、失敗した場合はfalseを返します。

ArrayObject::natsort()は、連想配列のを自然順アルゴリズムでソートし、キーと値の関連は維持されます。キーワードにある「by key」は、このキーと値の関連が保たれることを指し、キー自体をソートするものではありませんので注意が必要です。このメソッドは、元のArrayObjectオブジェクトを直接変更(インプレースソート)し、ソート後の新しいオブジェクトを返しません。戻り値は、ソート操作が成功したかどうかの真偽値(true/false)です。ソートされたデータは、元のArrayObjectから改めて取得してください。自然順ソートは、「image1.png」と「image10.png」のような連番を含む文字列を、人間が期待する順序で正しく並べ替えるのに役立ちます。

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

1<?php
2
3/**
4 * ArrayObject::natsort() メソッドの使用例。
5 *
6 * このスクリプトは、ArrayObject クラスの natsort メソッドを使って、
7 * 自然順アルゴリズムで要素をソートする方法を示します。
8 * natsort は "natural order" ソートの略で、数字部分を数値として比較するため、
9 * 'item2.txt' の次に 'item10.txt' が来るようにソートされます。
10 *
11 * キーワード「multidimensional array」に関して:
12 * ArrayObject::natsort() は、ArrayObject 自体の最上位の要素をソートします。
13 * そのため、多次元配列を直接ソートする用途には適していません。
14 * もし多次元配列の特定のキーや値を基準にソートしたい場合は、
15 * usort() や uasort() のようなカスタムソート関数をコールバックとして使用するか、
16 * ソートしたい列を抽出し、それを ArrayObject に格納して natsort() を適用するなどの
17 * 工夫が必要です。
18 *
19 * この例では、ファイル名のような文字列の配列を ArrayObject に格納し、
20 * natsort() を適用する基本的な使い方を示します。
21 */
22
23// 自然順ソートで効果がわかりやすいように、数字を含む文字列の配列を準備
24$data = [
25    'item10.txt',
26    'item2.txt',
27    'item1.txt',
28    'item20.txt',
29    'item_a.txt',
30    'item_b.txt',
31];
32
33// 配列を ArrayObject のインスタンスでラップ
34$arrayObject = new ArrayObject($data);
35
36echo "--- ソート前 (Original Order) ---\n";
37foreach ($arrayObject as $key => $value) {
38    echo sprintf("Key: %d, Value: %s\n", $key, $value);
39}
40echo "\n";
41
42// ArrayObject の要素を自然順ソートする
43// natsort() は成功した場合 true、失敗した場合 false を返します。
44$isSorted = $arrayObject->natsort();
45
46if ($isSorted) {
47    echo "--- ソート後 (Natural Order) ---\n";
48    foreach ($arrayObject as $key => $value) {
49        echo sprintf("Key: %d, Value: %s\n", $key, $value);
50    }
51} else {
52    echo "ソート操作に失敗しました。\n";
53}
54
55?>

PHP 8のArrayObject::natsort()メソッドは、ArrayObjectインスタンスが保持する要素を「自然順」でソートするためのメソッドです。自然順ソートとは、文字列中の数字部分を数値として比較するソート方式で、例えば「item10.txt」と「item2.txt」があった場合、一般的な辞書順ソートとは異なり、「item2.txt」の次に「item10.txt」が来るように並べ替えます。

このサンプルコードでは、複数のファイル名のような文字列を含む配列をArrayObjectとして初期化し、natsort()メソッドを呼び出してソートしています。ソート前とソート後のArrayObjectの内容を出力することで、自然順ソートがどのように作用するかを確認できます。

natsort()メソッドは引数を取らずに呼び出します。実行結果として、ソートが成功した場合はtrueを、失敗した場合はfalsebool型で返します。

このメソッドはArrayObjectの直接の要素のみをソートします。そのため、キーワードである「多次元配列 (multidimensional array)」の内部にある要素をソートする用途には直接適していません。多次元配列内の特定のキーや値を基準にソートしたい場合は、他のカスタムソート関数を検討する必要があります。

ArrayObject::natsort()は、PHPのArrayObjectインスタンスに格納された配列の最上位の要素を自然順アルゴリズムでソートするメソッドです。数字を含む文字列を数値として比較するため、「item2.txt」の次に「item10.txt」が来るようなソート順になります。

特に重要な注意点として、このメソッドは多次元配列を直接ソートする用途には適していません。多次元配列の内部の要素をソートしたい場合は、usort()uasort()のようなカスタムソート関数を別途利用するか、ソートしたい対象の配列をArrayObjectに格納するなどの工夫が必要です。メソッドの実行結果はboolで返されるため、ソートが成功したかを確認することをお勧めします。

関連コンテンツ