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

作成日: 更新日:

asort関数は、PHPにおいて配列をその要素の「値」に基づいて昇順にソートする関数です。この関数は、特に配列のキーと値の関連性を保持したまま値を並べ替えたい場合に非常に有用です。

例えば、連想配列において商品名とその価格がペアになっている場合など、値である価格で並べ替えつつ、どの商品(キー)がどの価格(値)であるかの情報が失われないようにしたい場合にasort関数を使用します。

この関数は、ソート対象となる配列を最初の引数として受け取ります。配列は参照渡しされるため、関数が実行されると、元の配列が直接変更されます。 2番目の引数にはオプションでソートの挙動を指定するための「ソートフラグ」を渡すことができます。例えば、SORT_NUMERICを指定すれば数値を数値として比較し、SORT_STRINGを指定すれば文字列として比較します。デフォルトではSORT_REGULARが使用され、通常の型に基づいて比較が行われます。SORT_NATURALフラグを使用すると、人間が自然に理解する順序(例: "file1", "file2", "file10")で文字列をソートすることも可能です。

ソートが成功した場合はtrueを、失敗した場合はfalseを返します。

asort関数と似た機能を持つ関数としてsort()関数がありますが、sort()関数がソート後に配列のキーを0から振り直すのに対し、asort()関数はキーと値のペアを維持するという点で明確な違いがあります。このキーの関連性維持は、データの一貫性を保ちたい場面で非常に重要となります。

基本的な使い方

構文(syntax)

<?php
$data = ["d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"];
asort($data, SORT_STRING);
?>

引数(parameters)

array &$array, int $flags = 0

  • array &$array: ソート対象の配列。この配列は参照で渡され、関数内で直接変更されます。
  • int $flags = 0: ソートの挙動を制御するためのフラグ。デフォルトは0で、キーと値のペアを維持したまま値でソートします。

戻り値(return)

bool

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

サンプルコード

PHP asort を利用した値降順ソート

<?php

/**
 * 指定された配列を値で昇順にソートし、その後、配列の要素順を反転させます。
 * キーと値の関連付けは維持されます。
 * 結果として、値が降順に並んだ配列が得られますが、これは asort の結果を反転させたものです。
 *
 * @param array<string|int, mixed> &$array ソートおよび要素順反転を行う対象の配列。参照渡しされます。
 * @return bool ソート操作が成功した場合は true、失敗した場合は false。
 */
function sortArrayByValueAscendingThenReverse(array &$array): bool
{
    // asort() は配列の値を昇順にソートし、キーとの関連付けを維持します。
    // この操作が成功したかどうかを $success に格納します。
    $success = asort($array);

    // ソートが成功した場合、配列の要素順を反転させます。
    // array_reverse() の第二引数に true を指定することで、元のキーが保持されます。
    // これにより、asort で昇順にソートされた結果が、値が降順に並んだような状態になります。
    if ($success) {
        $array = array_reverse($array, true);
    }

    return $success;
}

PHPのasort関数は、配列の要素を「値」に基づいて昇順(小さい方から大きい方へ)にソートする機能を持っています。この際、元のキーと値の関連付けは維持されます。引数&$arrayにはソート対象の配列を渡し、直接その配列が変更されます。戻り値はbool型で、ソート操作が成功した場合はtrue、失敗した場合はfalseを返します。

提示されたサンプルコードのsortArrayByValueAscendingThenReverse関数は、このasort関数とarray_reverse関数を組み合わせています。まずasortを使って配列の値を昇順にソートします。ソートが成功した場合、次にarray_reverse関数で配列の要素順を反転させます。array_reverseの第二引数にtrueを指定することで、ソートによって維持されたキーをさらに反転後も保持します。

この一連の処理により、asortで昇順にソートされた結果がarray_reverseによって逆順になるため、結果的には「値が降順に並んだような」配列が得られます。これは、asortで昇順にソートし、その結果を反転させることで降順に並べた状態を実現する典型的な方法です。

asort関数は、引数に指定された配列を直接変更します。これは「参照渡し」と呼ばれる仕組みで、元の変数の値が書き換わる点に注意が必要です。このコードはasortで昇順ソートした後にarray_reverseで順序を反転させていますが、同じ結果はarsort関数を使えば一度の処理で実現できます。arsortは配列を値で降順にソートし、キーと値の関連付けを維持するため、より簡潔で意図が伝わりやすい記述が可能です。また、array_reverse関数でキーを維持するには、サンプルコードのように第二引数へtrueを必ず指定してください。この指定がないと、キーが失われ数値インデックスに振り直されてしまいます。

PHP asort による大文字小文字を区別しない値でのソート

<?php

/**
 * Demonstrates how to sort an associative array by its values
 * in a case-insensitive manner using asort().
 *
 * This function is suitable for system engineers new to PHP,
 * showing how to use sort flags for specific comparison behaviors.
 */
function sortArrayCaseInsensitiveExample(): void
{
    // An associative array where keys are IDs and values are strings.
    // Notice the mixed casing in the fruit names.
    $fruits = [
        'item_001' => 'Banana',
        'item_002' => 'apple',
        'item_003' => 'Orange',
        'item_004' => 'grape',
        'item_005' => 'Apple', // This value is "Apple" (capital A)
        'item_006' => 'Cherry',
    ];

    echo "--- Original Array ---\n";
    print_r($fruits);

    // Sort the array by its values, case-insensitively,
    // while maintaining the original key-value associations.
    //
    // - SORT_STRING: Specifies that items should be compared as strings.
    // - SORT_FLAG_CASE: Modifies SORT_STRING (or SORT_NATURAL) to perform
    //                   a case-insensitive comparison.
    $success = asort($fruits, SORT_STRING | SORT_FLAG_CASE);

    if ($success) {
        echo "\n--- Sorted Array (Case-Insensitive by Value) ---\n";
        print_r($fruits);
    } else {
        echo "\nFailed to sort the array. The array might be empty or an error occurred.\n";
    }
}

// Execute the example function.
sortArrayCaseInsensitiveExample();

PHPのasort関数は、連想配列をその「値」に基づいて昇順でソートし、キーと値の関連付けを維持する関数です。提供されたサンプルコードは、このasort関数を使用して、配列の値を大文字・小文字を区別せず(ケースインセンシティブに)ソートする方法を示しています。

サンプルコードでは、まず複数の果物の名前を含む連想配列$fruitsが定義されています。この配列をソートするために、asort($fruits, SORT_STRING | SORT_FLAG_CASE)が呼び出されています。第一引数の$arrayにはソート対象の配列が参照渡しで渡されるため、ソート後には元の配列$fruitsの内容が直接変更されます。第二引数の$flagsはソートの挙動を制御するオプションです。ここではSORT_STRINGSORT_FLAG_CASE|(ビット論理和)で組み合わされています。SORT_STRINGは値を文字列として比較することを指定し、SORT_FLAG_CASEは大文字・小文字を区別しない比較を行うようにSORT_STRINGを補完します。これにより、「Apple」と「apple」が同じ順序で扱われます。

asort関数の戻り値はbool型で、ソートが成功した場合はtrue、失敗した場合はfalseを返します。サンプルコードでは、この戻り値を確認し、成功時にはソート結果を出力し、失敗時にはその旨を表示しています。このように、asort関数と適切なフラグを組み合わせることで、多様なソート要件に対応できます。

asortは引数として渡した元の配列が直接変更される破壊的な操作であるため、元の順序を保持したい場合は事前に配列をコピーしてください。大文字小文字を区別しないソートには、SORT_STRINGSORT_FLAG_CASE|演算子で組み合わせて指定します。SORT_FLAG_CASEは単独では機能せず、SORT_STRINGなどの比較タイプ指定フラグと必ず併用してください。関数の戻り値でソートの成否を必ず確認し、エラーハンドリングを検討してください。この関数は連想配列のキーと値の関連を維持しつつ、値でソートする特徴があります。

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