やりたいこと
懐かしの『駄菓子打線』が入った配列があります。
現状、背番号順に並んでいますが、このままの打順だと気に入らないので、
キー(背番号)の順番を並べ替えて、打順を組み替えたいと思います。
(打順について、異論は認めます。)
環境
PHP 8.0.1
PHPのソート関数
PHPで用意されている配列をソートする関数があれば、それを使いたいと思います。
公式を参照すると、これだけありました。
関数名 | ソートの基準 | キーと値の相関関係 | ソート順 |
---|---|---|---|
array_multisort() | 値 | 文字列がキーの場合は維持し、数値添字配列の場合は維持しない | 最初の配列、あるいはソートオプション |
asort() | 値 | 維持する | 昇順 |
arsort() | 値 | 維持する | 降順 |
krsort() | キー | 維持する | 降順 |
ksort() | キー | 維持する | 昇順 |
natcasesort() | 値 | 維持する | 大文字小文字を区別しない自然順 |
natsort() | 値 | 維持する | 自然順 |
rsort() | 値 | 維持しない | 降順 |
shuffle() | 値 | 維持しない | ランダム |
sort() | 値 | 維持しない | 昇順 |
uasort() | 値 | 維持する | ユーザー定義 |
uksort() | キー | 維持する | ユーザー定義 |
usort() | 値 | 維持しない | ユーザー定義 |
今回は配列のキーを元に、任意の順に並べ替えたいので、この中からuksortが使えそうです。
uksortで並び替え
早速やってみましょう。
理想の打順に背番号をならべた配列を定義した後、
array_flip()でその配列のキーと値を入れ替えたものを$sortLineup
に入れます。
配列の値を比べて、同じだった場合は0を返します。
また、$sortLineup[$arg1]
が $sortLineup[$arg2]
より小さい場合には-1を返して、大きい場合には1を返しています。
最後にuksortで並べ替えます。
$nostalgieSnack = [
1 => 'ポテトフライ',
2 => 'フエラムネ',
3 => 'ビッグカツ',
4 => 'タラタラしてんじゃねーよ',
5 => 'キャベツ太郎',
6 => 'モロッコヨーグル',
7 => 'カットよっちゃん',
8 => 'うまい棒',
9 => 'ココアシガレット',
];
$sortLineup = array_flip([8, 4, 1, 3, 5, 9, 2, 7, 6]);
$sortBy = function (int $arg1, int $arg2) use ($sortLineup) : int
{
if ($sortLineup[$arg1] === $sortLineup[$arg2]) {
return 0;
}
return ($sortLineup[$arg1] > $sortLineup[$arg2]) ? 1 : -1;
};
uksort($nostalgieSnack, $sortBy);
var_dump($nostalgieSnack);
//$nostalgieSnack = [
// 8 => 'うまい棒',
// 4 => 'タラタラしてんじゃねーよ',
// 1 => 'ポテトフライ',
// 3 => 'ビッグカツ',
// 5 => 'キャベツ太郎',
// 9 => 'ココアシガレット',
// 2 => 'フエラムネ',
// 7 => 'カットよっちゃん',
// 6 => 'モロッコヨーグル',
//];
理想の打順になりました。
ちなみに
uksortと同様にusort, uasortを使うと配列の値を比較して並び替えができます。
せっかくなので、実際にやってみましょう。
今回もソート順はユーザー定義なので、
return ($arg1 < $arg2) ? -1 : 1;
上記のようにリターンし、昇順にしてみます。
usort
$nostalgieSnack = [
1 => 'ポテトフライ',
2 => 'フエラムネ',
3 => 'ビッグカツ',
4 => 'タラタラしてんじゃねーよ',
5 => 'キャベツ太郎',
6 => 'モロッコヨーグル',
7 => 'カットよっちゃん',
8 => 'うまい棒',
9 => 'ココアシガレット',
];
$sortValue = function (string $arg1, string $arg2) : int {
if ($arg1 === $arg2) {
return 0;
}
return ($arg1 < $arg2) ? -1 : 1;
};
usort($nostalgieSnack, $sortValue);
var_dump($nostalgieSnack);
//$nostalgieSnack = [
// 0 => 'うまい棒'
// 1 => 'カットよっちゃん'
// 2 => 'キャベツ太郎'
// 3 => 'ココアシガレット'
// 4 => 'タラタラしてんじゃねーよ'
// 5 => 'ビッグカツ'
// 6 => 'フエラムネ'
// 7 => 'ポテトフライ'
// 8 => 'モロッコヨーグル'
//];
usort関数は、「キーと値の関係を維持しない」ソートなので、値がソートされてキーが振り直されているのが分かります。
uasort
//(中略)
uasort($nostalgieSnack, $sortValue);
var_dump($nostalgieSnack);
//$nostalgieSnack = [
// 8 => 'うまい棒'
// 7 => 'カットよっちゃん'
// 5 => 'キャベツ太郎'
// 9 => 'ココアシガレット'
// 4 => 'タラタラしてんじゃねーよ'
// 3 => 'ビッグカツ'
// 2 => 'フエラムネ'
// 1 => 'ポテトフライ'
// 6 => 'モロッコヨーグル'
];
uasort関数は、「キーと値の関係を維持する」ソートなので、値がソートされてキーは振り直されることなくそのままです。
さいごに
PHPのソート関数は便利
参考文献
https://www.php.net/manual/ja/function.uksort.php
https://www.php.net/manual/ja/array.sorting.php