LoginSignup
2
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-09-30

やりたいこと

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

Noto Sans Black (2).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で並べ替えます。

$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

2
0
1

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
2
0