はじめに
連想配列の特定の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