お知らせ

【PHP】【初学者向け】uasort()の使い方とメリット・デメリットを完全解説!usortとの違いと実例付き

PHP

どうも、こんにちは。ぴこっそです。今回はPHPでuasort()に関する使い方やメリット・デメリットについて解説を行います。また今回の記事ではusort()との違いも解説しております。

usort()についてもっと詳しく知りたいと思う方は以下の記事をチェックしてみてください。

この記事を最後まで読めば、

• uasort()の正しい使い方
• usort()との違い
• どんな場面で使うのが最適か

がしっかり理解できるはずです。

uasort()とは

uasort() は「ユーザー定義の比較関数」を使って配列をソートする関数です。

通常のsort()やasort()とは違い、自分で決めたルールに基づいてソートすることができるのが最大の強みです。

基本構文は以下のとおりです。

uasort(array &$array, callable $callback): bool

このコードの意味:

引数説明
$arrayarray(参照渡し)ソート対象の配列。この配列そのものが並び替えられます。
$callbackcallable(関数 or 無名関数)比較ルールを定義する「ユーザー定義関数」。2つの値を受け取り、順序を示す値(-1, 0, 1)を返します。

:bool(戻り値)は成功時にtrueを返し、失敗時にはfalseを返します。

このように定義を見てみると、「配列の値を自由に並び替えができる点」はusort()と似ているようにも思います。

uasort()を使ってみよう

uasort()を実際に使ったコードを以下に挙げておきます。

//配列
$data = [
  "apple" => 300,
  "banana" => 100,
  "orange" => 200
];

//uasortを使いユーザーが定義した関数を元に並び替え
uasort($data, function($a, $b) {
  //宇宙船演算子を使い、昇順に並び替えをするように定義
  return $a <=> $b;
});

//並び替えた配列を出力
print_r($data);

ポイント
・宇宙船演算子を使い、配列内のデータを昇順に並び替える定義をしたこと

・uasort()を使い、ユーザーが定義した通りに並び替える

・並び替えた配列データを昇順に出力する

また上記のコードの出力結果は以下のとおりです。

Array ( [banana] => 100 [orange] => 200 [apple] => 300 )

このように、配列内の各数値が昇順に並んでおり連想配列のキーのデータも格納されていることがわかります。

コード内に宇宙船演算子が登場していますが、もっと詳しく知りたい方は以下の記事をチェックしてみてください。

私個人としては、uasort()は配列のデータを並び替えた後の出力データが非常にわかりやすいと感じます。

uasort()とusort()の違い

uasort()とusort()の違いは

並び替えた配列データのキーを保持しているか、いないかの違い

です。そして、

uasort()が配列データのキーを保持している

usort()が配列データのキーを保持していない

ということになります。

とくに出力後の違いに着目するとわかりやすいです。いかにそのコードを載せておきます。

$data = [
  "apple"  => 300,
  "banana" => 100,
  "orange" => 200
];

// usort(キー保持なし)
$temp1 = $data;
usort($temp1, function($a, $b) {
  return $a <=> $b;
});

// uasort(キー保持あり)
$temp2 = $data;
uasort($temp2, function($a, $b) {
  return $a <=> $b;
});

print_r($temp1);
print_r($temp2);

上記のコードは、連想配列の$dataにあるデータを

usort()を使った構文$temp1

uasort()を使った構文$temp2

の出力データを比較するコードです。出力したコードの結果は以下のとおりです。

// usort() の結果(キーが消える)
Array
(
  [0] => 100
  [1] => 200
  [2] => 300
)

// uasort() の結果(キーが保持される)
Array
(
  [banana] => 100
  [orange] => 200
  [apple] => 300
)

出力結果をみると、usort()の出力データはキーが保持されておらず、[0]や[1]に置き換わっていることがわかります。このように、出力結果を見れば、usrot()とuasort()の違いが一目瞭然

uasort()を使うメリット

uasort()を使うメリットについても解説します。メリットは主に3つあります。

並び替えのルールを「自由に定義」できる

通常sort()では配列のデータを「昇順」または「降順」しか対応できないのに対し、uasort()では、「点数の高い順」「名前の長い順」「日付の新しい順」「複数条件でのソート」など、完全に自分仕様のルールで並び替えが可能です。

コードをシンプルに書ける

uasort()は関数や無名関数を使うことによって、わずか1行でルールを定義することができます。

特に宇宙船演算子(<=>)を使うことによって、複雑なif文を書かずに済みます。

uasort($data, function($a, $b) {return $a <=> $b;});

→ 見た目もすっきり、メンテもしやすい。

出力されたデータが見やすい

uasort()とusort()の違いについての解説でも触れましたが、uasort()は連想配列を並び替えた後も、そのキーを保持しているため、どのキーがどのデータなのかが一目でわかります。

// usort() の結果(キーが消える)
Array
(
  [0] => 100
  [1] => 200
  [2] => 300
)

// uasort() の結果(キーが保持される)
Array
(
  [banana] => 100
  [orange] => 200
  [apple] => 300
)

このようにuasort()ではキーの名前も保持されるので、出力されたデータの読みやすさも大幅に向上しています。

uasort() の最大の魅力は「自由度・簡潔さ・可読性」
データの意味を保ちながら、自分で決めた並び順を実現できる万能なソート関数です。

uasort()を使うデメリット

uasort()を使うデメリットも解説します。デメリットは主に2つです。

並び替え基準のミスがバグにつながる

比較関数の中で return の条件を誤ると、想定とまったく違う順番にソートされる可能性があります。

// 間違った例(比較の向きが逆)
uasort($data, function($a, $b) {
  return $a > $b; // これだと正しい並びにならない
});

戻り値が -1, 0, 1 であることを意識して書かないと、「なぜか順番がおかしい」というデバッグしにくいバグになりがちです。

処理速度が遅くなることがある(特に大規模配列)

uasort() は要素ごとに ユーザー定義関数を繰り返し呼び出すため、内部的にsort()やasort()よりも処理コストが高くなります。

特に何千・何万件もの配列をソートする場合、
無名関数を何度も実行する分、パフォーマンスが低下することがあります。

そのため、
• 大量データの並び替え
• サーバー側で頻繁に呼び出す処理
では、注意が必要です。

uasort()では自由にルールを決めれる特徴があるものの、アルゴリズムや使える場面を考える必要があり、使いこなすには慣れが必要になってくると私は考えます。

まとめ

今回はuasort()の使い方、usort()との違いとメリットやデメリットについて解説しました。

uasort()はusort()と同様、「ユーザー定義の比較関数」を使って配列をソートする関数であるものの、uasort()では並び替えた配列データのキーを保持しているのに対し、usort()では保持してないという違いがありました。

uasort()を使うメリットとデメリットは以下のとおりです。

メリットデメリット
並び替えのルールを「自由に定義」できる並び替え基準のミスがバグにつながる
コードをシンプルに書ける処理速度が遅くなることがある
出力されたデータが見やすい

このように、uasort()では使える場面やバグがおこならないようなアルゴリズムを考える必要がありものの、汎用性が高く、さまざまな場面で応用が効く関数であると私は考えます。

最後に

今回の記事でuasort()の使い方が理解できた人が一人でもいれば嬉しい限りだと私は考えます。

ブログ活動のほかにもXでプログラミングの記事や情報を発信していますので、ぜひフォローの方、よろしくお願いいたします。

https://twitter.com/pikosso1268?s=21

では最後までご覧いただき、ありがとうございました。

今後も初心者でも理解しやすいJavaScript・PHPの基礎シリーズを投稿していきます!

どうぞよろしくお願いいたします。

コメント

タイトルとURLをコピーしました