[PHP] 連想配列のソートで便利に使える"array_multisort"

2018年11月10日

PHP テクノロジー プログラミング

自宅にAmazonから注文していたダンボールがいくつか届いて並べていると、どうしても頭の中が配列のイメージになってきます。 プログラム教育の時に配列を箱を書いて説明するアレですね。 プログラムを上達させようとする時に、配列を極めなければいけません。 データ管理は、ライブラリやSQLなどのデータベースに任せておけばいい・・・なんていう甘っちょろい考えをしている人は、確実に上達できません。 そもそも、データベースから取得したデータの扱いこそがプログラムの真骨頂なんですからね。 そんな配列にも、多重配列、連想配列、多重連想配列、などなど、より複雑な形式になった時のソート操作を行う必要があり、"array_multisort"を使ってみて、便利に使えることが分かったので、理解した内容をブログに記載しておきます。 ただしこのやり方はPHPのみに限られてしまうので、他の言語においてはまたベット調査することにしましょう。

PHP配列のソートの基本

PHPは配列のソートを行うのにたくさんの関数が用意されています。 http://php.net/manual/ja/array.sorting.php
sort() , rsort() , asort , arsort() , ksort() , krsort() , usort() , uasort() , uksort() , natsort() , natcasesort() , array_multisort() , shuffle()
なんと13種類もあるんですね。 通常の1階層配列であれば、sort()とrsort()の2つが使えれば何の問題もないのですが、連想配列で多重配列などの場合には、これだけでは難しいですね。 もちろん、便利関数を使わずに、自分でアルゴリズムを書き込む方法もありますが、せっかくある便利関数を覚えて効率化するのも悪くはありません。 アルゴリズム構築は時間がある余暇でやることにしましょう。仕事では効率一番・・・

array_multisortの使い方

以下のような配列がある場合にいくつかのソートをしたい場合があります。 Array ( [0] => Array ( [name] => orange [price] => 400 [buyDay] => 2018-11-02 ) [1] => Array ( [name] => apple [price] => 200 [buyDay] => 2018-11-01 ) [2] => Array ( [name] => banana [price] => 300 [buyDay] => 2018-11-03 ) ) 家計簿のデータのサンプルですが、フルーツを購入した記録データを見立ててます。 これを表示する時に、購入日順にする場合と、料金の高い順にする場合、名前の文字列順にするパターンと、様々なソート方法が想像できます。 とりあえず、すべてやってみると以下のような感じです。 <?php $data = array( array( "name" => "orange", "price" => 400, "buyDay" => "2018-11-02" ), array( "name" => "apple", "price" => 200, "buyDay" => "2018-11-01" ), array( "name" => "banana", "price" => 300, "buyDay" => "2018-11-03" ) ); print_r($data); // 名前順 $names = array(); foreach($data as $key => $value){ array_push($names , $value["name"]); } array_multisort($names , SORT_ASC , $data); print_r($data); // 値段順 $prices = array(); foreach($data as $key => $value){ array_push($prices , $value["price"]); } array_multisort($prices , SORT_ASC , $data); print_r($data); // 購入日順 $buyDay = array(); foreach($data as $key => $value){ array_push($buyDay , $value["buyDay"]); } array_multisort($buyDay , SORT_ASC , $data); print_r($data);

実行結果

名前順

Array ( [0] => Array ( [name] => apple [price] => 200 [buyDay] => 2018-11-01 ) [1] => Array ( [name] => banana [price] => 300 [buyDay] => 2018-11-03 ) [2] => Array ( [name] => orange [price] => 400 [buyDay] => 2018-11-02 ) )

値段順

Array ( [0] => Array ( [name] => apple [price] => 200 [buyDay] => 2018-11-01 ) [1] => Array ( [name] => banana [price] => 300 [buyDay] => 2018-11-03 ) [2] => Array ( [name] => orange [price] => 400 [buyDay] => 2018-11-02 ) )

購入日順

Array ( [0] => Array ( [name] => apple [price] => 200 [buyDay] => 2018-11-01 ) [1] => Array ( [name] => orange [price] => 400 [buyDay] => 2018-11-02 ) [2] => Array ( [name] => banana [price] => 300 [buyDay] => 2018-11-03 ) ) array_multisortの"SORT_ASC"の部分は、昇順ソートをする命令になっていて、"SORT_ASC"とすると降順ソートすることができます。 SQLから取得したデータを並び替えする時に非常に便利に使えそうですね。 配列操作を鍛えると、データ管理能力がどんどんアップするので、より複雑なデータ管理ができるように日々勉強しなければいけませんね。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。