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

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

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

作成日: 更新日:

基本的な使い方

array_multisort関数は、複数の配列を同時にソートしたり、多次元配列の特定の列を基準にソートしたりする関数です。

この関数は、関連する複数のデータを同じ基準で並べ替えたい場合に非常に役立ちます。例えば、名前、年齢、点数がそれぞれ別の配列に格納されている場合、array_multisort関数を使用すると、名前の昇順でソートしつつ、年齢や点数の配列もそれに対応して並べ替えることができます。

使い方は、まずソートしたい配列を引数として渡します。その後に、ソートの順序(昇順SORT_ASC、降順SORT_DESCなど)やソートのタイプ(数値としてソートするSORT_NUMERIC、文字列としてソートするSORT_STRINGなど)を指定する定数を続けることができます。これらの順序やタイプは、ソート対象の配列ごとに個別に指定することが可能です。

array_multisort関数は、引数として渡された元の配列自体を変更(ソート)します。新しいソート済み配列を返すわけではありませんのでご注意ください。処理が成功した場合はtrueを、失敗した場合はfalseを返します。この関数を使うことで、複雑な条件でのデータ並べ替えを効率的に行うことができます。

構文(syntax)

1<?php
2$fruits = ["orange", "apple", "banana"];
3$colors = ["red", "green", "yellow"];
4
5array_multisort($fruits, $colors);
6?>

引数(parameters)

array|string &$array, array|int|string &...$rest

  • array|string &$array: ソート対象となる配列、または文字列の配列。参照渡しされるため、元の配列が変更されます。
  • array|int|string &...$rest: 最初の配列 $array に対応する、追加のソートキーとなる配列、またはソート順序を指定する文字列(SORT_ASC, SORT_DESC)や数値(SORT_REGULAR, SORT_NUMERIC, SORT_STRING, SORT_LOCALE_STRING, SORT_NATURAL, SORT_FLAG_CASE)。参照渡しされるため、元の配列が変更されます。

戻り値(return)

bool

array_multisort 関数は、成功した場合は TRUE を返します。失敗した場合は FALSE を返します。

サンプルコード

PHPでarray_multisortする

1<?php
2
3/**
4 * array_multisort() 関数を使用して、複数のカラム(フィールド)を基準に配列をソートする例です。
5 *
6 * この関数は、主にデータベースのテーブルのように、複数のフィールドを持つレコードの集まりを
7 * 複数のキー(カラム)に基づいて並べ替えたい場合に利用されます。
8 *
9 * 例では、ユーザーのリストを「年齢」で降順にソートし、
10 * さらに年齢が同じ場合は「スコア」で降順にソートします。
11 */
12
13// ソートしたいデータを用意します。
14// 各要素は、'name', 'age', 'score' のキーを持つ連想配列(ユーザー情報)です。
15$users = [
16    ['name' => 'Alice',   'age' => 30, 'score' => 95],
17    ['name' => 'Bob',     'age' => 25, 'score' => 88],
18    ['name' => 'Charlie', 'age' => 30, 'score' => 92], // Aliceと同じ年齢だがスコアは低い
19    ['name' => 'David',   'age' => 25, 'score' => 90], // Bobと同じ年齢だがスコアは高い
20    ['name' => 'Eve',     'age' => 35, 'score' => 98],
21];
22
23echo "--- ソート前のデータ ---" . PHP_EOL;
24foreach ($users as $user) {
25    echo "名前: {$user['name']}, 年齢: {$user['age']}, スコア: {$user['score']}" . PHP_EOL;
26}
27echo PHP_EOL;
28
29// array_multisort() に渡すために、ソートキーとなるカラムの値を抽出します。
30// array_column() は、配列の特定のキーの値をすべて抽出して新しい配列を作成します。
31$ages   = array_column($users, 'age');   // 年齢のリスト
32$scores = array_column($users, 'score'); // スコアのリスト
33
34// array_multisort() を使用して、複数の基準で $users 配列をソートします。
35// 引数の順序は以下のようになります:
36// 1. 第一ソートキーの配列 ($ages)
37// 2. 第一ソートキーのソート順 (SORT_DESC: 降順)
38// 3. 第一ソートキーのデータ型 (SORT_NUMERIC: 数値として比較)
39// 4. 第二ソートキーの配列 ($scores)
40// 5. 第二ソートキーのソート順 (SORT_DESC: 降順)
41// 6. 第二ソートキーのデータ型 (SORT_NUMERIC: 数値として比較)
42// 7. 最後に、実際にソートを適用したい元の配列 ($users)
43$success = array_multisort(
44    $ages,   SORT_DESC, SORT_NUMERIC,
45    $scores, SORT_DESC, SORT_NUMERIC,
46    $users
47);
48
49if ($success) {
50    echo "--- ソート後のデータ (年齢:降順, スコア:降順) ---" . PHP_EOL;
51    foreach ($users as $user) {
52        echo "名前: {$user['name']}, 年齢: {$user['age']}, スコア: {$user['score']}" . PHP_EOL;
53    }
54} else {
55    echo "データのソートに失敗しました。" . PHP_EOL;
56}
57
58?>

PHPのarray_multisort関数は、複数の配列や、多次元配列(例えば、データベースのレコードのような構造)を複数のキーに基づいてソートするために使用されます。この関数は引数として、まずソートの基準となるキーの配列、次にそのソート順(SORT_ASCで昇順、SORT_DESCで降順)、そしてデータ型(SORT_NUMERICで数値、SORT_STRINGで文字列など)を渡します。これらのソート基準のペアを複数指定し、最後に実際にソートを適用したい元の配列を渡します。引数は参照渡しのため、渡された配列自体がソートによって変更されます。戻り値は、ソートが成功した場合はtrue、失敗した場合はfalseを返します。

サンプルコードでは、ユーザーの情報を保持する$usersという連想配列のリストをソートしています。最初にarray_column関数を使い、ソートの基準としたい「年齢」と「スコア」の値をそれぞれ別の配列として抽出します。その後、array_multisort関数に、抽出した$ages配列と$scores配列を、それぞれ降順(SORT_DESC)かつ数値型(SORT_NUMERIC)として比較するように指定して渡します。そして、最後にソート対象である元の$users配列を指定することで、ユーザーリストが「年齢」の降順で、さらに年齢が同じ場合は「スコア」の降順に並べ替えられます。これにより、複数の条件に基づいた複雑なソート処理を効率的に実行できます。

array_multisort関数は、ソート対象の元の配列を直接変更する(破壊的変更)ことに注意が必要です。もし元のデータを保持したい場合は、事前に配列のコピーを作成してください。引数には、ソートキーとなる配列、そのソート順(昇順・降順)、データ型(数値・文字列など)をセットで指定し、最後に実際にソートを適用したい元の配列を渡します。特にデータ型はSORT_NUMERICSORT_STRINGなどで正確に指定し、意図しないソート結果を防ぐことが重要です。また、関数はソートの成否をブール値で返すため、必ず戻り値を確認してエラーハンドリングを行うようにしましょう。

array_multisortでNULLを最後にソートする

1<?php
2
3/**
4 * 配列に含まれる NULL 値をソート結果の最後に配置する関数です。
5 *
6 * array_multisort 関数を使用して、補助配列で NULL 値を識別し、
7 * その補助配列を主キーとしてソートすることで、NULL 値を最後に移動させます。
8 * NULL 以外の値は、元の配列のデータ型に応じて昇順でソートされます。
9 *
10 * @param array &$data ソート対象の配列(参照渡しのため、関数内で変更されます)。
11 */
12function sortArrayWithNullsLast(array &$data): void
13{
14    // 補助配列を生成し、元の配列の各要素が NULL かどうかを判定します。
15    // NULL であれば 1、そうでなければ 0 を割り当てます。
16    // これにより、後続のソートで NULL 値をグループ化し、最後に移動させることができます。
17    $nullFlags = [];
18    foreach ($data as $value) {
19        $nullFlags[] = ($value === null) ? 1 : 0;
20    }
21
22    // array_multisort 関数を使用してソートを実行します。
23    // 1. まず、$nullFlags を主キーとしてソートします。
24    //    SORT_ASC (昇順) でソートするため、0 が最初に、1 (NULL に対応) が最後に並びます。
25    //    SORT_NUMERIC は、数値として比較することを指示します。
26    // 2. 次に、$data を副キーとしてソートします。
27    //    $nullFlags の値が同じ要素(例: すべて 0 の要素や、すべて 1 の要素)内で、
28    //    $data の値が SORT_ASC (昇順) でソートされます。
29    //    SORT_REGULAR は、PHP の標準的な比較ルールに基づいてソートすることを指示します。
30    //    これにより、NULL でない値は通常の昇順ソートが適用され、NULL 値はすべて最後に集められます。
31    array_multisort(
32        $nullFlags, SORT_ASC, SORT_NUMERIC, // NULLフラグを昇順でソート(0が先、1が後)
33        $data,      SORT_ASC, SORT_REGULAR  // 元の配列の値を昇順でソート(NULLでない値の順序付け)
34    );
35}
36
37// === サンプルコードの実行例 ===
38
39// ソート対象の配列を準備します。NULL値と様々なデータ型の値が含まれています。
40$myArray = ['banana', null, 'apple', 10, null, 'orange', 5, 'grape', 20];
41
42echo "--- ソート前 ---" . PHP_EOL;
43print_r($myArray);
44
45// 関数を呼び出して配列をソートします。
46sortArrayWithNullsLast($myArray);
47
48echo PHP_EOL . "--- ソート後 (NULL値が最後に配置) ---" . PHP_EOL;
49print_r($myArray);
50
51// 別の配列で動作を確認
52$anotherArray = ['Zebra', null, 'Alpha', 'Beta', null, 'Gamma'];
53
54echo PHP_EOL . "--- 別のソート前 ---" . PHP_EOL;
55print_r($anotherArray);
56
57sortArrayWithNullsLast($anotherArray);
58
59echo PHP_EOL . "--- 別のソート後 (NULL値が最後に配置) ---" . PHP_EOL;
60print_r($anotherArray);
61
62?>

PHPのarray_multisort関数は、複数の配列を同時に、または多次元配列の特定の列を基準にしてソートする際に使用する、非常に強力な関数です。引数には、ソートしたい配列を複数指定でき、それぞれの配列に対してソート順(昇順または降順)や比較タイプ(数値、文字列、通常など)を設定できます。配列は参照渡しされるため、関数内で直接変更されます。この関数の実行が成功した場合はtrue、失敗した場合はfalseが戻り値として返されます。

提示されたサンプルコードでは、array_multisortを利用して、配列内に含まれるNULL値を常にソート結果の最後に配置する処理を実装しています。まず、元の配列の各要素がNULLであるかどうかを判定し、NULLであれば1、そうでなければ0を格納する補助配列$nullFlagsを作成します。

次に、array_multisort関数を呼び出し、$nullFlagsをソートの第一基準として指定します。この補助配列を昇順(SORT_ASC)かつ数値(SORT_NUMERIC)でソートすることで、0の要素(NULLではない値)が先に、1の要素(NULL値)が後にグループ化されます。続いて、元の配列$dataを第二基準として、昇順(SORT_ASC)かつ通常の比較(SORT_REGULAR)でソートします。この二段階のソート処理により、NULLではない値は元のデータ型に応じた通常の昇順で並べられ、すべてのNULL値は配列の最後にまとめて配置される結果となります。この方法は、特定の値をソート結果の特定の場所に固定したい場合に役立ちます。

本コードは参照渡しのため、引数の配列が直接上書きされる点に注意が必要です。array_multisortはソート成否をブール値で返しますが、本関数では確認していません。必要に応じてエラーハンドリングを導入し、安全に利用ください。NULLでない値のソートに利用されているSORT_REGULARは、データ型が混在する配列で期待通りの順序にならない可能性があります。厳密なソートには、データ型に合わせたSORT_NUMERICSORT_STRINGの指定をご検討ください。このソート処理は配列のキーをリセットし、元のキーは失われます。

PHP: array_multisort で複数配列をソートする

1<?php
2
3/**
4 * array_multisort() の使用例
5 * 複数の配列を、指定したキーとソート順に基づいて同時にソートします。
6 *
7 * この例では、人々の名前と年齢を表す2つの配列があります。
8 * これらをまず年齢の昇順でソートし、もし年齢が同じであれば名前の昇順でソートします。
9 * array_multisort は、渡された配列を「参照渡し」で受け取り、直接内容を変更します。
10 */
11
12// ソート対象の配列を準備します
13$names = ['Taro', 'Jiro', 'Hanako', 'Saburo', 'Emi'];
14$ages = [30, 25, 30, 28, 25];
15
16echo "--- ソート前 ---\n";
17echo "名前: " . implode(', ', $names) . "\n";
18echo "年齢: " . implode(', ', $ages) . "\n\n";
19
20// array_multisort を使用して、複数配列をソートします。
21//
22// 最初の引数 ($ages) がプライマリソートキーとなります。
23//   - SORT_ASC: 昇順 (小さい順)
24//   - SORT_NUMERIC: 数値として比較
25// 次の引数 ($names) がセカンダリソートキーとなります。
26//   - プライマリソートキー ($ages) の値が同じ場合にのみ適用されます。
27//   - SORT_ASC: 昇順 (小さい順)
28//   - SORT_STRING: 文字列として比較
29$success = array_multisort(
30    $ages,       // プライマリソートキーとなる配列
31    SORT_ASC,    // プライマリキーを昇順にソート
32    SORT_NUMERIC,// プライマリキーを数値として比較
33
34    $names,      // セカンダリソートキーとなる配列
35    SORT_ASC,    // セカンダリキーを昇順にソート
36    SORT_STRING  // セカンダリキーを文字列として比較
37);
38
39echo "--- ソート後 (年齢昇順、次いで名前昇順) ---\n";
40if ($success) {
41    echo "ソート成功!\n";
42    echo "名前: " . implode(', ', $names) . "\n";
43    echo "年齢: " . implode(', ', $ages) . "\n";
44} else {
45    echo "ソート失敗。\n";
46}
47
48?>

PHPのarray_multisort関数は、複数の配列を同時にソートする際に使用します。関連するデータを別々の配列で管理している場合でも、それらの配列を同期させながらまとめて並べ替えることが可能です。例えば、人々の名前と年齢が別々の配列に入っていても、年齢順に並べ替えつつ、年齢が同じ場合は名前順にするといった複雑なソートが実現できます。

この関数に渡される配列は「参照渡し」という形で扱われます。これは、関数内で配列が直接変更されることを意味し、ソート後の結果が元の配列にそのまま反映されます。引数としては、まずソートしたい配列を一つ渡し、その後にその配列に対するソート順(昇順のSORT_ASCや降順のSORT_DESCなど)と、比較方法(数値として比較するSORT_NUMERICや文字列として比較するSORT_STRINGなど)をセットで指定します。これを複数回繰り返すことで、優先順位の高いプライマリソートキーと、次に優先されるセカンダリソートキーを設定することができます。

サンプルコードでは、まず$ages配列を年齢の昇順、数値としてソートするプライマリキーとして指定しています。次に、$agesの値が同じ場合に適用されるセカンダリキーとして$names配列を名前の昇順、文字列としてソートするように設定しています。

戻り値はbool型で、ソート処理が成功した場合はtrue、何らかの理由で失敗した場合はfalseを返します。これにより、ソートが正しく行われたかを確認できます。

array_multisort関数は、引数で渡された配列の値を直接変更します(参照渡し)。元の配列の状態を保持したい場合は、事前に配列のコピーを作成してから使用してください。複数の配列を同時にソートする際、引数の指定順がソートの優先順位となります。プライマリキー、セカンダリキーといった順に正しく指定することが重要です。また、関数はソートの成否をブール値で返しますので、実行後に必ず戻り値を確認し、適切に処理を行うことをお勧めします。ソート対象となる各配列は、通常同じ要素数を持つ必要があります。さらに、SORT_NUMERICSORT_STRINGのように、データの型に合わせた適切な比較モードを選択してください。

PHPで連想配列を複数キーでソートする

1<?php
2
3/**
4 * 複数のキーに基づいて連想配列の配列をソートする関数
5 *
6 * @param array $data ソート対象の連想配列の配列
7 * @return array ソートされた連想配列の配列
8 */
9function sortAssociativeArrayByMultipleKeys(array $data): array
10{
11    // ソートキーとなるカラムの値を抽出
12    // 例えば、氏名で昇順、次にスコアで降順にソートしたい場合
13    $names = array_column($data, 'name');
14    $scores = array_column($data, 'score');
15
16    // array_multisortを使用して、複数のキーで配列をソート
17    // 最初の引数から順にソートの優先順位となる
18    // ソートの方向 (SORT_ASC: 昇順, SORT_DESC: 降順) とタイプ (SORT_REGULAR, SORT_NUMERIC, SORT_STRING) を指定
19    // 最後にソート対象の元の配列 ($data) を渡すことで、その順序が変更される
20    array_multisort(
21        $names,  SORT_ASC,   SORT_STRING, // nameカラムを文字列として昇順ソート
22        $scores, SORT_DESC,  SORT_NUMERIC, // scoreカラムを数値として降順ソート
23        $data                            // 元の連想配列の配列をこれらのソート順で並び替える
24    );
25
26    return $data;
27}
28
29// サンプルデータ
30$employees = [
31    ['id' => 1, 'name' => 'Alice',   'score' => 85],
32    ['id' => 2, 'name' => 'Bob',     'score' => 90],
33    ['id' => 3, 'name' => 'Charlie', 'score' => 75],
34    ['id' => 4, 'name' => 'Alice',   'score' => 95], // Aliceは2人目
35    ['id' => 5, 'name' => 'Bob',     'score' => 80], // Bobは2人目
36];
37
38echo "ソート前のデータ:\n";
39print_r($employees);
40
41// 関数を呼び出してソートを実行
42$sortedEmployees = sortAssociativeArrayByMultipleKeys($employees);
43
44echo "\nソート後のデータ (名前昇順、スコア降順):\n";
45print_r($sortedEmployees);
46
47?>

PHPのarray_multisort関数は、複数の条件(キー)に基づいて配列をソートするために使用します。特に、連想配列の配列を特定のキーの値で複雑に並べ替えたい場合に非常に役立つ関数です。

この関数は、ソート対象となる複数の配列と、それぞれの配列に対するソート順(SORT_ASCで昇順、SORT_DESCで降順)、ソートタイプ(SORT_STRINGで文字列、SORT_NUMERICで数値など)を引数として受け取ります。引数の順番がそのままソートの優先順位となります。最後の引数には、これらの指定された条件に基づいて実際に並べ替えたい元の配列を渡します。この元の配列は参照渡しされるため、関数内で直接順序が変更されます。戻り値は、ソートが成功した場合はtrue、失敗した場合はfalseを返します。

サンプルコードでは、従業員データの連想配列の配列をソートする例を示しています。まずarray_columnを使って、'name''score'カラムの値をそれぞれ独立した配列として抽出しています。その後、array_multisortにこれらの抽出した配列とソート条件、そして元の従業員データ配列を渡しています。具体的には、$namesを文字列として昇順(SORT_ASC, SORT_STRING)でソートし、次に$scoresを数値として降順(SORT_DESC, SORT_NUMERIC)でソートすることで、元の従業員データが「名前の昇順」で、さらに同名の人がいる場合は「スコアの降順」で並べ替えられます。

array_multisort関数は、複数の配列の順序に基づき、渡された元の配列を直接変更します。戻り値はソート成功の真偽値であり、新しい配列は返されません。元の配列が変更される点にご注意ください。

連想配列をソートする場合は、サンプルコードのようにarray_columnでソートキーとなる値を抽出し、それをarray_multisortの引数に指定するのが一般的な方法です。ソート優先順位は引数の指定順となり、各キーには昇順・降順(SORT_ASC/SORT_DESC)とデータ型(SORT_STRING/SORT_NUMERICなど)を適切に指定してください。特に、数値データを文字列としてソートすると意図しない結果になることがあるため、正しいソートタイプを選ぶことが重要です。

関連コンテンツ

関連プログラミング言語