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

作成日: 更新日:

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

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

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

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

基本的な使い方

構文(syntax)

<?php
$fruits = ["orange", "apple", "banana"];
$colors = ["red", "green", "yellow"];

array_multisort($fruits, $colors);
?>

引数(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 で複数配列をソートする

<?php

/**
 * array_multisort() の使用例
 * 複数の配列を、指定したキーとソート順に基づいて同時にソートします。
 *
 * この例では、人々の名前と年齢を表す2つの配列があります。
 * これらをまず年齢の昇順でソートし、もし年齢が同じであれば名前の昇順でソートします。
 * array_multisort は、渡された配列を「参照渡し」で受け取り、直接内容を変更します。
 */

// ソート対象の配列を準備します
$names = ['Taro', 'Jiro', 'Hanako', 'Saburo', 'Emi'];
$ages = [30, 25, 30, 28, 25];

echo "--- ソート前 ---\n";
echo "名前: " . implode(', ', $names) . "\n";
echo "年齢: " . implode(', ', $ages) . "\n\n";

// array_multisort を使用して、複数配列をソートします。
//
// 最初の引数 ($ages) がプライマリソートキーとなります。
//   - SORT_ASC: 昇順 (小さい順)
//   - SORT_NUMERIC: 数値として比較
// 次の引数 ($names) がセカンダリソートキーとなります。
//   - プライマリソートキー ($ages) の値が同じ場合にのみ適用されます。
//   - SORT_ASC: 昇順 (小さい順)
//   - SORT_STRING: 文字列として比較
$success = array_multisort(
    $ages,       // プライマリソートキーとなる配列
    SORT_ASC,    // プライマリキーを昇順にソート
    SORT_NUMERIC,// プライマリキーを数値として比較

    $names,      // セカンダリソートキーとなる配列
    SORT_ASC,    // セカンダリキーを昇順にソート
    SORT_STRING  // セカンダリキーを文字列として比較
);

echo "--- ソート後 (年齢昇順、次いで名前昇順) ---\n";
if ($success) {
    echo "ソート成功!\n";
    echo "名前: " . implode(', ', $names) . "\n";
    echo "年齢: " . implode(', ', $ages) . "\n";
} else {
    echo "ソート失敗。\n";
}

?>

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

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

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

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

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

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

<?php

/**
 * 複数のキーに基づいて連想配列の配列をソートする関数
 *
 * @param array $data ソート対象の連想配列の配列
 * @return array ソートされた連想配列の配列
 */
function sortAssociativeArrayByMultipleKeys(array $data): array
{
    // ソートキーとなるカラムの値を抽出
    // 例えば、氏名で昇順、次にスコアで降順にソートしたい場合
    $names = array_column($data, 'name');
    $scores = array_column($data, 'score');

    // array_multisortを使用して、複数のキーで配列をソート
    // 最初の引数から順にソートの優先順位となる
    // ソートの方向 (SORT_ASC: 昇順, SORT_DESC: 降順) とタイプ (SORT_REGULAR, SORT_NUMERIC, SORT_STRING) を指定
    // 最後にソート対象の元の配列 ($data) を渡すことで、その順序が変更される
    array_multisort(
        $names,  SORT_ASC,   SORT_STRING, // nameカラムを文字列として昇順ソート
        $scores, SORT_DESC,  SORT_NUMERIC, // scoreカラムを数値として降順ソート
        $data                            // 元の連想配列の配列をこれらのソート順で並び替える
    );

    return $data;
}

// サンプルデータ
$employees = [
    ['id' => 1, 'name' => 'Alice',   'score' => 85],
    ['id' => 2, 'name' => 'Bob',     'score' => 90],
    ['id' => 3, 'name' => 'Charlie', 'score' => 75],
    ['id' => 4, 'name' => 'Alice',   'score' => 95], // Aliceは2人目
    ['id' => 5, 'name' => 'Bob',     'score' => 80], // Bobは2人目
];

echo "ソート前のデータ:\n";
print_r($employees);

// 関数を呼び出してソートを実行
$sortedEmployees = sortAssociativeArrayByMultipleKeys($employees);

echo "\nソート後のデータ (名前昇順、スコア降順):\n";
print_r($sortedEmployees);

?>

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など)を適切に指定してください。特に、数値データを文字列としてソートすると意図しない結果になることがあるため、正しいソートタイプを選ぶことが重要です。

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