Help us understand the problem. What is going on with this article?

【 php 】usort関数の使い方

More than 1 year has passed since last update.

php usort関数の使い方

  • phpの配列の中身を並び替える関数はいくつかあります。自分で指定した意図通りに並び替えることができるusort関数というものがあり、使い方がわかりにくかったので、まとめました。

usort関数 概要

公式:usort — ユーザー定義の比較関数を使用して、配列を値でソートする
bool usort ( array &$array , callable $value_compare_func )

要するにusort()は...

  • 自分で指定した順番で配列の中身を並び替えることができる
  • 順番の指定はコールバック関数で行う

呼び出し方の例 (第一引数に配列、第二引数にコールバック関数)

usort($orders, 'sortStrlen');

解説

注文を配列にし、商品名の長さに応じて、usort関数で並び替えてみます。

 $orders = [
     'ナゲット',
     'チキンフィレオ',
     'ポテト',
     'ダブルチーズバーガー',
     'えびフィレオ',
     'コーラ',
 ];

並び替えのための、自分で定義した比較関数

function sortStrlen($a, $b) {
    if (strlen($a) === strlen($b)) {
        return 0;
    }
    return (strlen($a) < strlen($b)) ? -1 : 1;
};

sortStrlen()で行なっていること

  • $orders配列の中身となる$a$bをstrlen関数で文字列の長さで比較をさせています。
  • 比較結果に応じて振り分けを行い、0, -1, 1を返しています。

この0, -1, 1という返り値が、配列を並び替える際に使われる値となります。

返り値 詳細
0 $a$bの文字列の長さが同じ場合には、0を返すので、順番の並び替えは発生せずそのままとなります。
-1 $aの方が$bよりも短い長さの場合には、-1を返すので、$aの順番を$bより繰り下げることになります。
1 $aの方が$bよりも長い長さの場合には、1を返すので、$aの順番を$bより繰り上げることになります。
  • (引数の$a$bにはusort()の第一引数で与えた配列の値が入ります)

もっと具体的に

返り値 $a $b 挙動
0 ポテト コーラ $a(ポテト)$b(コーラ)と同じ長さなので、0を返し、$a(ポテト)の順番と、$b(コーラ)それぞれの順番の並び替えは行いません。
-1 ナゲット ビックマック $a(ナゲット)$b(ビックマック)よりも短いので、-1を返し、$a(ナゲット)の順番を、$b(ビッグマック)よりも繰り下げます。
1 ナゲット コーラ $a(ナゲット)$b(コーラ)よりも長いので、1を返し、$a(ナゲット)の順番を、$b(コーラ)よりも繰り上げます。
  • ↑これを配列の全部の値で順々に組み合わせを作成して実行し、順番の上下を行うことで、最終的には長さに応じて並び替えを行なっています

実際に$a$bの中身と返り値を全て出して見ます。

------------------------
$a : ポテト
$b : チキンフィレオ
返り値 : -1
------------------------
$a : コーラ
$b : ポテト
返り値 : 0
------------------------
$a : ポテト
$b : ナゲット
返り値 : -1
------------------------
$a : えびフィレオ
$b : ポテト
返り値 : 1
------------------------
$a : ダブルチーズバーガー
$b : ポテト
返り値 : 1
------------------------
$a : ナゲット
$b : ポテト
返り値 : 1
------------------------
$a : ダブルチーズバーガー
$b : ナゲット
返り値 : 1
------------------------
$a : ダブルチーズバーガー
$b : えびフィレオ
返り値 : 1
------------------------
$a : チキンフィレオ
$b : ダブルチーズバーガー
返り値 : -1
------------------------
$a : ナゲット
$b : チキンフィレオ
返り値 : -1
------------------------
$a : えびフィレオ
$b : ナゲット
返り値 : 1
------------------------
$a : チキンフィレオ
$b : ナゲット
返り値 : 1
------------------------
$a : えびフィレオ
$b : チキンフィレオ
返り値 : -1
------------------------

コメントを添えてもう一度

function sortStrlen($a, $b) {
    // 同じ長さの場合には、順序を変えない
    if (strlen($a) === strlen($b)) {
        return 0;
    }
    // $aの方が短い場合には、$aの順番を$bより繰り下げる
    // $aの方が長い場合には、$aの順番を$bより繰り上げる
    return (strlen($a) < strlen($b)) ? -1 : 1;
};

出力例としては以下の通りです。

// 出力
echo "並び替える前の注文\n";
foreach ($orders as $key => $value) {
    echo "$key: $value\n";
}


// 並び替え実行
usort($orders, 'sortStrlen');


// 出力
echo "名前の長さで並び替え\n";
foreach ($orders as $key => $value) {
    echo "$key: $value\n";
}

実行結果

並び替え前
0: ナゲット
1: チキンフィレオ
2: ポテト
3: ダブルチーズバーガー
4: えびフィレオ
5: コーラ

並び替え後
0: ポテト
1: コーラ
2: ナゲット
3: えびフィレオ
4: チキンフィレオ
5: ダブルチーズバーガー

要するにusort()は...

  • 自分で指定した順番で配列の中身を並び替えることができる
  • 順番の指定はコールバック関数で行う

というものでした!


参考 php公式
* http://php.net/manual/ja/function.usort.php

creema
全国のつくり手とつかい手が Web 上で直接作品を売買できる、日本最大級のハンドメイドマーケットプレイス「Creema」の企画、開発、運営するスタートアップです。「本当にいいものが埋もれてしまうことのない、フェアで大規模な新しい経済圏をつくろう」を合言葉に、メンバー一丸となって、たのしくストイックに活動を行っています。
https://www.creema.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした