PHP
連想配列
array_multisort
natsort

【PHP】連想配列の特定のkeyを基準にソートする際に困ったこと

はじめに

連想配列の特定のkeyを基準にソートをする際に困ったことを自分用メモとして残します。
最終的に、@shy_azusaさんとここを参考にして、PHPマニュアルをしっかり読むことで解決いたしました。助かりました、ありがとうございます!

困ったこととは

以下のようなvalueに数値だけではなく、文字を含まれていたりする連想配列を一つのkeyを基準にしてソートしようとしたときに、2桁数値でよく陥る、きれいに配列を並べられない問題に直面しました。

例となる連想配列
Array
(
    [0] => Array
        (
            [id] => HOGE360180_0.2
            [name] => HOGE(360x180) / 5分
        )

    [1] => Array
        (
            [id] => HOGE360180_1
            [name] => HOGE(360x180) / 1分
        )

    [2] => Array
        (
            [id] => HOGE540360_0.2
            [name] => HOGE(540x360) / 5分
        )

    [3] => Array
        (
            [id] => HOGE540360_15
            [name] => HOGE(540x360) / 15分
        )

    [4] => Array
        (
            [id] => HOGE540360_60
            [name] => HOGE(540x360) / 60時間
        )

)
陥ったソート後の連想配列
Array
(
    [0] => Array
        (
            [id] => HOGE360180_1
            [name] => HOGE(360x180) / 1分
        )

    [1] => Array
        (
            [id] => HOGE360180_0.2
            [name] => HOGE(360x180) / 5分
        )

    [2] => Array
        (
            [id] => HOGE540360_15
            [name] => HOGE(540x360) / 15分
        )

    [3] => Array
        (
            [id] => HOGE540360_0.2
            [name] => HOGE(540x360) / 5分
        )

    [4] => Array
        (
            [id] => HOGE540360_60
            [name] => HOGE(540x360) / 60時間
        )

)

どう解決したのか

結論は、しっかりPHPマニュアル読めよという話なのですが・・・。

2桁数値の時に直面する、具合の悪いソートは、natsort()を使って解決していたのですが、連想配列になるとどうなるのだろう。
と思っていたら、しっかりPHPマニュアルに書いてありました。

SORT_NATURAL - natsort() と同様の「自然順」で、アイテムを文字列として比較します。

このフラグを使えば、PHPマニュアルにもあるように、natsort()と同様な動きをしてくれるそうです。

以下のようにやったら、きれいに連想配列の特定のkeyを基準にソートしてくれました。

ソース
<?php
$array = [
  $test01 = [
    "id" => "HOGE360180_0.2",
    "name" => "HOGE(360x180) / 5分"
  ],
  $test01 = [
    "id" => "HOGE360180_1",
    "name" => "HOGE(360x180) / 1分"
  ],
  $test01 = [
    "id" => "HOGE540360_0.2",
    "name" => "HOGE(540x360) / 5分"
  ],
  $test01 = [
    "id" => "HOGE540360_15",
    "name" => "HOGE(540x360) / 15分"
  ],
  $test01 = [
    "id" => "HOGE540360_60",
    "name" => "HOGE(540x360) / 60時間"
  ]
];

foreach($array as $key => $value){
  $tmp[$key] = $value["name"];
}
array_multisort($tmp, SORT_NATURAL, $array);
print_r($array);
結果
Array
(
    [0] => Array
        (
            [id] => HOGE360180_1
            [name] => HOGE(360x180) / 1分
        )

    [1] => Array
        (
            [id] => HOGE360180_0.2
            [name] => HOGE(360x180) / 5分
        )

    [2] => Array
        (
            [id] => HOGE540360_0.2
            [name] => HOGE(540x360) / 5分
        )

    [3] => Array
        (
            [id] => HOGE540360_15
            [name] => HOGE(540x360) / 15分
        )

    [4] => Array
        (
            [id] => HOGE540360_60
            [name] => HOGE(540x360) / 60時間
        )

)

最後に

このarray_multisortのフラグ機能を知らなかったので、連想配列の特定のkeyを基準にソートするために、文字を切り取って無理やり並べようとかしてた自分が恥ずかしい。。
連想配列のソートには、array_multisortが便利だ!ということでした。

参考

・PHPの多次元連想配列のソート
https://qiita.com/shy_azusa/items/54dadc55e3e71cde1445
・natsort - 配列を値で自然順にソートする
https://lab.syncer.jp/Web/PHP/Reference/Function/natsort/
・PHPマニュアル
http://php.net/manual/ja/function.array-multisort.php