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公式