Posted at

【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