##はじめに
https://qiita.com/Hiraku/items/62821d7d0e7af1ac211e
こちら様の記事の個人用メモになります。難しい!
###宇宙船演算子の基本
<=>
と記載する「小なり」「イコール」「大なり」がくっついた演算子のこと。名称がわからず検索に苦労。
三方比較演算子とも表記するみたいです。基本的にusort()
関数と併用します。
基本的に$a <=> $b
とした場合、usortで指定した配列は昇順(0,1,2,...)でソートされます。
対して、$b <=> $a
とした場合は指定した配列が降順(...,2,1,0)でソートされる、という特徴があるようです。
###サンプル1
$array = array(1,0,3,2);
usort ($array, function ($a, $b){
return $a <=> $b; //昇順に並び替えられる 0,1,2,3
});
print_r($array);
/* 出力結果
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
)
*/
$array = array(1,0,3,2);
usort ($array, function ($a, $b){
return $b <=> $a; //降順に並び替えられる 3,2,1,0
});
print_r($array);
/* 出力結果
Array
(
[0] => 3
[1] => 2
[2] => 1
[3] => 0
)
*/
###サンプル2(2次元配列)
$array = [
[2,2], [5,3], [3,5], [3,4], [4,2], [2,3], [2,5], [3,6], [2,4], [4,1]
];
//[値x,値y]として配列に入っている。
//今回はxの値を優先的に昇順(0,1,2,...)でソートされるように決定。
//xの値が、比較先のxと同じである場合はyの値を確認し、yが降順(...,2,1,0)に並ぶようにする。
usort ($array , function ($a, $b) {
//$aのxと、$bのxが同じだった場合。
//===は変数の型も同じである場合。(==と記載した場合も、今回のコードは動きます)。
if ($a[0] === $b[0]) {
//yの降順で並べる
//降順の際は、比べている値を逆さに記載する
return $b[1] <=> $a[1];
}
//それ以外の場合は、xの値を昇順に並べる
return $a[0] <=> $b[0];
});
foreach ($array as $a) {
echo implode(' ', $a). "\n";
}
/* 出力結果
2 5
2 4
2 3
2 2
3 6
3 5
3 4
4 2
4 1
5 3
*/
###さいごに
自分以外が見ても分かるように書いたつもりですが、自分の理解していない箇所についてはうまく言語化できず・・・
記事にしてアップすると知識が定着すること以外にも、自分の弱い箇所も分かって良いですね。
自分で配列の値を弄って、実行して結果を見て様子を確認していくと結構理解が進んだ気がします。