LoginSignup
26
24

More than 5 years have passed since last update.

【 php 】usort関数の使い方

Last updated at Posted at 2018-10-02

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

26
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
24