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

【PHP8.x】arsort()関数の使い方

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

作成日: 更新日:

基本的な使い方

arsort関数は、連想配列を含む配列をその値に基づいて降順(大きいものから小さいものへ)にソートし、同時に各要素のキーと値の関連性を維持する関数です。この関数は、例えば商品の売上データのように、各商品名(キー)と売上額(値)のペアを保ったまま、売上額の高い順に並べ替えたい場合に非常に便利です。

この関数は、ソートしたい配列を最初の引数として受け取ります。そして、オプションの2番目の引数として$flagsを指定できます。$flagsには、ソートの振る舞いを細かく制御するための定数を渡すことが可能です。デフォルトではSORT_REGULARが使用され、通常の比較が行われます。他に、数値を文字列として比較するSORT_STRINGや、数値として比較するSORT_NUMERICなどがあり、データの種類に応じて適切なソート方法を選択できます。

arsort関数は、ソートが成功した場合はtrueを、失敗した場合はfalseを返します。この関数は、引数として渡された元の配列自体を変更することに注意が必要です。新しいソート済み配列が返されるわけではありませんので、元の配列の内容が必要な場合は、事前にコピーを作成してください。PHP 8.4の環境で利用可能です。

構文(syntax)

1<?php
2
3$fruits = ["d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"];
4arsort($fruits);
5print_r($fruits);
6
7?>

引数(parameters)

array &$array, int $flags = SORT_REGULAR

  • array &$array: ソート対象の配列。配列は参照渡しされるため、関数実行後に元の配列が変更されます。
  • int $flags = SORT_REGULAR: ソート順序を指定するフラグ。デフォルトは SORT_REGULAR で、要素を通常通り比較します。

戻り値(return)

true

配列を値の降順にソートし、インデックスを保持する操作が成功した場合は TRUE を返します。

サンプルコード

PHP arsort関数で配列を値降順ソートする

1<?php
2
3/**
4 * arsort関数は、配列の値を降順(大きい順)にソートします。
5 * その際、元のキーと値の関連付けは維持されます。
6 * 主に連想配列を値に基づいてソートする際に使用されます。
7 */
8
9// 例として、科目の点数を表す連想配列を準備します。
10$subjectScores = [
11    "国語" => 85,
12    "数学" => 92,
13    "理科" => 78,
14    "社会" => 92, // 数学と同じ点数
15    "英語" => 85, // 国語と同じ点数
16];
17
18echo "ソート前の配列:\n";
19print_r($subjectScores);
20
21// arsort関数を呼び出し、配列を値で降順にソートします。
22// キーと値の関連付けは維持されます。
23// 同じ値を持つ要素の相対的な順序は、ソートの種類によっては保証されません。
24arsort($subjectScores);
25
26echo "\narsortでソート後の配列 (値で降順、キーの関連付け維持):\n";
27print_r($subjectScores);
28
29// 注意: arsort関数は、ソートが成功した場合は常に true を返しますが、
30// 通常はこの戻り値は無視されます。配列自体が直接変更されます。
31
32?>

PHPのarsort関数は、配列の要素を「値」に基づいて降順(大きい順)にソートする際に使用されます。この関数は、特に連想配列において、元のキーと値の関連付けを維持したまま、値の大きさで並び替えたい場合に非常に便利です。

提供されたサンプルコードでは、まず科目の点数を表す連想配列$subjectScoresが用意されています。この配列は「国語」が85点、「数学」が92点といった形で、科目名と点数が紐付けられています。arsort関数を呼び出す前には、print_rを使って現在の配列の状態を表示し、ソート前の並びを確認しています。

その後、arsort($subjectScores);と記述することで、$subjectScores配列が直接変更され、各科目の点数が高い順に並び替えられます。この際、「国語」と85点といった元のキーと値のペアは崩れずに、新しい順序で再配置されます。同じ値を持つ要素の相対的な順序は特定のソートフラグを使用しない限り保証されない点に注意が必要です。

arsort関数の最初の引数&$arrayは、ソート対象の配列を指定し、参照渡しのため関数内で元の配列が直接変更されます。二番目のオプション引数$flagsはソートの挙動(例えば文字列を数値として比較するかなど)を調整できますが、省略するとデフォルトのSORT_REGULARが適用されます。この関数はソートが成功した際に常にtrueを返しますが、通常この戻り値は配列自体が変更されるため確認せずに利用されます。

arsort関数は、配列の値を降順にソートし、キーと値の関連付けを維持する際に使用します。特に連想配列の値を基準に並べ替えたい場合に役立ちます。

最も重要な注意点は、引数の配列が参照渡しであるため、関数を呼び出すと元の配列そのものが直接変更される点です。新しい配列が返されるわけではありませんのでご注意ください。

また、同じ値を持つ要素が複数存在する場合、それらの相対的な順序は保証されません。arsort関数はソートが成功すると常にtrueを返しますが、これは通常無視され、エラーチェックに利用されることはありません。配列が変更されていることを確認すれば十分です。

PHP arsortで多次元配列をソートする

1<?php
2
3/**
4 * 多次元配列の各内部配列に対してarsort関数を適用し、
5 * その内部配列の要素を値で降順にソートします。
6 * キーと値の関連性は維持されます。
7 *
8 * @param array $data ソート対象の多次元配列。参照渡しのため、元の配列が直接変更されます。
9 */
10function applyArsortToInnerArrays(array &$data): void
11{
12    echo "--- ソート前のデータ ---\n";
13    print_r($data);
14
15    echo "\n--- 各内部配列にarsortを適用中 ---\n";
16    foreach ($data as $key => &$innerArray) {
17        // 各内部配列が配列であることを確認し、arsortを適用
18        // arsortは配列の要素を値の降順にソートし、キーとの関連性を維持します。
19        if (is_array($innerArray)) {
20            arsort($innerArray);
21            echo "カテゴリ '{$key}' の内部配列をソートしました。\n";
22        }
23    }
24    // ループ変数への参照を解除します。これはPHPにおける良い習慣です。
25    unset($innerArray);
26
27    echo "\n--- ソート後のデータ ---\n";
28    print_r($data);
29}
30
31// サンプルデータ: 複数のカテゴリとその商品、価格を模した多次元配列を準備
32$productsByCategory = [
33    'fruits' => [
34        'apple' => 150,
35        'banana' => 100,
36        'orange' => 200,
37        'grape' => 180,
38    ],
39    'vegetables' => [
40        'potato' => 80,
41        'tomato' => 120,
42        'carrot' => 90,
43    ],
44    'dairy' => [
45        'milk' => 250,
46        'cheese' => 300,
47        'yogurt' => 150,
48    ],
49    'empty_category' => [], // 空のカテゴリも適切に処理されることを確認
50];
51
52// 定義した関数を呼び出し、多次元配列の各内部配列をarsortでソート
53applyArsortToInnerArrays($productsByCategory);

PHPのarsort関数は、配列の要素を「値」に基づいて降順(大きい順)にソートします。この際、配列の「キーと値の関連性」を維持するのが最大の特徴です。例えば、商品の名前とその価格のペアで構成された配列がある場合、価格でソートしても各商品名が対応する価格から離れることはありません。

引数$arrayにはソートしたい配列を渡しますが、これは「参照渡し」であるため、arsort関数を実行すると元の配列の内容が直接変更されます。戻り値は、ソート処理が成功したことを示すtrueです。

サンプルコードでは、このarsort関数を多次元配列(配列の中にさらに配列がある構造)の各内部配列に適用する方法を示しています。applyArsortToInnerArrays関数は、商品カテゴリ(例:'fruits')と、そのカテゴリ内の商品名と価格のペアを値とした多次元配列$productsByCategoryを受け取ります。そして、foreachループを使って各カテゴリの内部配列を取り出し、それぞれにarsortを適用することで、各カテゴリの商品を価格の高い順にソートしています。これにより、各カテゴリ内で価格の高い商品から順にデータが整理され、元の配列のキー(商品名)との関連性を保ちながら情報が把握しやすくなります。

arsort関数は、引数として渡された配列の要素を値で降順にソートし、元の配列を直接変更します。キーと値の関連性は維持されるため、元のペア情報は失われません。サンプルコードでは、多次元配列の各内部配列に対してこの処理を行いますが、foreachループ内の&$innerArrayも参照渡しであり、元の多次元配列の内部配列が直接書き換えられます。そのため、データの意図しない変更には特に注意が必要です。また、ループ後のunset($innerArray)による参照解除は、予期せぬ動作を防ぐための良い習慣です。PHP 8ではソートに失敗することはないため、戻り値の確認は不要です。

PHP arsort: 値で降順ソートする

1<?php
2
3// arsort関数は、配列をその値に基づいて降順にソートします。
4// この際、キーと値の関連付けは維持されます。
5
6// ソート対象となる連想配列を定義します。
7// ここでは、果物の名前とその在庫数を想定しています。
8$fruits = [
9    "apple"  => 10,
10    "orange" => 5,
11    "banana" => 15,
12    "grape"  => 8,
13    "kiwi"   => 10, // appleと同じ値を持つ要素
14];
15
16echo "--- ソート前の配列の状態 ---\n";
17print_r($fruits);
18
19// arsort関数を呼び出して配列をソートします。
20// 第一引数: &array $array - ソートする配列(参照渡しなので元の配列が直接変更されます)
21// 第二引数: int $flags = SORT_REGULAR - ソートの挙動を制御するフラグ。
22//           省略した場合はSORT_REGULAR(通常の比較)が適用されます。
23arsort($fruits);
24
25echo "\n--- ソート後の配列の状態 (値で降順、キー関連付け維持) ---\n";
26print_r($fruits);
27
28// 出力結果を見ると、値が「15 (banana)」から降順にソートされ、
29// 値が同じ「10 (apple, kiwi)」の場合は、元の配列での順序が維持されていることがわかります
30// (PHP 8.0.0以降では、同じ値の要素の相対的な順序は維持されます)。
31
32?>

arsort関数は、PHP 8で利用できる配列操作関数の一つです。この関数は、与えられた配列をその「値」に基づいて「降順」にソートします。特に重要なのは、ソート後も元の「キーと値の関連付けが維持される」点です。これは、連想配列を扱う際に非常に役立ちます。

サンプルコードでは、果物の名前とその在庫数を表す連想配列$fruitsを定義しています。まずソート前の配列の状態を表示し、次にarsort($fruits)を呼び出してソートを実行しています。

この関数は第一引数にソートしたい配列を「参照渡し」で受け取ります。そのため、元の配列$fruitsが直接変更されます。第二引数にはソートの挙動を制御するフラグを指定できますが、省略した場合はSORT_REGULARが適用され、通常の比較が行われます。戻り値は常にtrueです。

ソート後の出力を見ると、在庫数の多い順(降順)に配列が並び替えられていることが確認できます。例えば、「banana (15)」が最初に、次に「apple (10)」と「kiwi (10)」が並んでいます。PHP 8以降では、このように値が同じ要素の場合、元の配列での相対的な順序が維持されるため、appleの次にkiwiが来ています。これにより、データの意味を保ちながら効率的に配列を整理することができます。

arsort関数は、引数で渡された配列そのものを直接変更する「参照渡し」の関数です。そのため、元の配列の内容が書き換わることに特に注意が必要です。この関数は配列の値を基準に降順でソートしますが、各要素のキーと値の関連付けはそのまま維持されます。PHP 8.0.0以降では、値が同じ要素の元の相対的な順序が安定して維持されますので、その点を理解しておくと良いでしょう。第二引数のソートフラグ($flags)を使うと、数値や文字列としての比較方法を細かく指定でき、予期せぬソート結果を防ぐために重要です。必要に応じてSORT_NUMERICSORT_STRINGなどの適切なフラグを選択してください。

PHP arsortで値の降順ソートする

1<?php
2
3/**
4 * PHPのarsort関数は、配列をその値に基づいて降順(大きいものから小さいものへ)にソートします。
5 * この関数は、ソート後もキーと値の既存の関連付けを維持します。
6 * システムエンジニアを目指す初心者の方へ:キー(識別子)を保持したまま、値の大きさで並び替えたい場合に便利です。
7 */
8function demonstrateArsortBasic(): void
9{
10    // ソート対象となる連想配列を定義します。
11    // 各要素は「名前 (キー)」と「スコア (値)」で構成されています。
12    $scores = [
13        "Alice" => 85,
14        "Bob" => 92,
15        "Charlie" => 78,
16        "David" => 92,
17        "Eve" => 85
18    ];
19
20    echo "--- ソート前の配列 ---" . PHP_EOL;
21    print_r($scores);
22
23    // arsort関数を呼び出し、配列の値を降順にソートします。
24    // 例えば、92 -> 85 -> 78 の順になります。
25    // キー("Bob", "David"など)はそれぞれの値と結びついたまま移動します。
26    // 第2引数 $flags はオプションで、デフォルトは SORT_REGULAR (通常の比較) です。
27    // この関数はソートが成功すると true を返します。
28    $isSorted = arsort($scores);
29
30    echo PHP_EOL . "--- arsort() 適用後の配列 (値の降順ソート) ---" . PHP_EOL;
31    print_r($scores);
32
33    echo "arsort() の実行結果: " . ($isSorted ? "成功 (true)" : "失敗 (false)") . PHP_EOL;
34}
35
36// サンプルコードを実行します。
37demonstrateArsortBasic();
38
39?>

PHPのarsort関数は、配列の要素をその値に基づいて降順(大きいものから小さいものへ)にソートする機能を提供します。この関数を使用すると、ソート後も配列のキーと値の既存の関連付けが維持されます。システムエンジニアを目指す初心者の方にとって、例えば「名前」と「スコア」のように、キーと値がペアになっているデータをスコアの高い順に並べ替えたい場合に非常に便利です。

この関数は、引数としてソートしたい配列$arrayを受け取ります。この$arrayは参照渡しであるため、関数が実行されると元の配列自体がソートされた状態に直接変更されます。オプションの引数$flagsはソートの挙動を調整するためのもので、デフォルト値はSORT_REGULAR(通常の比較)が適用されます。arsort関数は、ソート処理が成功した場合にtrueを戻り値として返します。これにより、関数が期待通りに動作したかを確認することができます。キーを保持したまま値の大きさでデータを整理する際に、この関数は効率的な手段を提供します。

arsort関数は、渡された配列そのものを値の降順でソートし、元の配列が直接変更される点に注意してください。ソート後も、各要素のキーと値の関連付けは維持されますので、連想配列の要素の識別子(キー)を失わずに値の大きさで並べ替えたい場合に適しています。例えば、商品コード(キー)と在庫数(値)がある場合に、在庫数を多い順に並べても商品コードを保持したいといった用途で役立ちます。第二引数$flagsを指定することで、文字列として比較するSORT_STRINGや数値として比較するSORT_NUMERICなど、ソートの挙動を詳細に制御できます。PHP 8.0以降では、この関数は常にtrueを返しますが、これはソート処理がエラーなく完了したことを意味します。

関連コンテンツ

関連プログラミング言語