【PHP】配列のキーを並び替えて｟駄菓子打線｠組んでみた


# やりたいこと 

懐かしの『駄菓子打線』が入った配列があります。
現状、背番号順に並んでいますが、このままの打順だと気に入らないので、
キー（背番号）の順番を並べ替えて、打順を組み替えたいと思います。

![Noto Sans Black (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694053/f21d1655-2db6-14cb-ec39-4f470b842bd7.png)


（打順について、異論は認めます。）


# 環境
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で並べ替えます。

```php
$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
```php
$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
```php
//(中略)

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