LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

はじめに

連想配列の特定の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

0
0
0

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