DBからの検索結果をPHPで並び替える(array_multisortの利用、昇順、降順、複数のソートキー、ユーザー定義ソート)
こんにちは、@yoheiMuneです。
先日は「PHPの連想配列のソートいろいろ」を書きました。
今日は、データベースからの取得した結果(配列の中に複数の連想配列が含まれているもの、いわゆる多次元配列)を、
https://www.php.net/manual/ja/function.array-multisort.php
最後になりますが本ブログでは、PHP、フロントエンド、Python、インフラ、サーバー、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!
先日は「PHPの連想配列のソートいろいろ」を書きました。
今日は、データベースからの取得した結果(配列の中に複数の連想配列が含まれているもの、いわゆる多次元配列)を、
array_multisort
関数を用いて、並び替える方法をブログに書きたいと思います。目次
今回説明に使うデータ
以下のような、配列の中に連想配列が入ったもの(=多次元配列)を使いたいと思います。$fruits = [ array('id' =>'01', 'name' => 'apple'), array('id' =>'02', 'name' => 'orange'), array('id' =>'03', 'name' => 'pinapple') ];フルーツの一覧を、データベースから取得した時のデータ構造のイメージです。
任意のキーで、昇順に並び替える
まずは、並び替えに使うキーを決めます。ここではid
列の値で並び替えたいと思います。id
の昇順に並び替えるには、array_multisort()
を用いて実装します。// id の昇順に並び替える. // 並び替えの基準を取得します. $ids = []; foreach($fruits as $fruit) { $ids[] = $fruit['id']; } // PHP5.5以降では、下記の書き方でもOK. $ids = array_column($fruits, 'id'); // idの昇順(SORT_ASC)に並び替える. array_multisort($ids, SORT_ASC, $fruits); // Array // ( // [0] => Array // ( // [id] => 01 // [name] => apple // ) // [1] => Array // ( // [id] => 02 // [name] => orange // ) // [2] => Array // ( // [id] => 03 // [name] => pinapple // ) // )
任意のキーで、降順に並び替える
id
の降順に並び替えるには、ソート順にSORT_DESC
を指定します。// id の降順に並び替える. // 並び替えの基準を取得します. $ids = array_column($fruits, 'id'); // idの降順(SORT_DESC)に並び替える. array_multisort($ids, SORT_DESC, $fruits); // Array // ( // [0] => Array // ( // [id] => 03 // [name] => pinapple // ) // [1] => Array // ( // [id] => 02 // [name] => orange // ) // [2] => Array // ( // [id] => 01 // [name] => apple // ) // )
複数のキーを使って、並び替える
今までは1つのキーのみで並び替えしていましたが、複数のキーでもソートできます。// 今回使うデータ. // 第1ソートキー(volume)に同じ値があり、一意にソートできないので、 // 第2ソートキー(edition)も指定します. $data = []; $data[] = array('volume' => 67, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 1); $data[] = array('volume' => 85, 'edition' => 6); $data[] = array('volume' => 98, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 6); $data[] = array('volume' => 67, 'edition' => 7); // 第1ソートキー(volume) $volume = array_column($data, 'volume'); // 第2ソートキー(edition) $edition = array_column($data, 'edition'); // データを volume の降順、edition の昇順にソートします. // $data を最後のパラメータとして渡し、同じキーでソートします. array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); // Array // ( // [0] => Array // ( // [volume] => 98 // [edition] => 2 // ) // [1] => Array // ( // [volume] => 86 // [edition] => 1 // ) // [2] => Array // ( // [volume] => 86 // [edition] => 6 // ) // [3] => Array // ( // [volume] => 85 // [edition] => 6 // ) // [4] => Array // ( // [volume] => 67 // [edition] => 2 // ) // [5] => Array // ( // [volume] => 67 // [edition] => 7 // ) // )
ユーザー独自定義の並び順で並び替える
usort()
を使うと、並び順を自由に定義できます。ここではname
列の文字数で並び替えをしてみました。// ユーザー独自定義のソート. usort($fruits, function ($f1, $f2) { // ここでは name の文字数の多い順に並べています. return strlen($f2['name']) - strlen($f1['name']); }); // Array // ( // [0] => Array // ( // [id] => 03 // [name] => pinapple // ) // [1] => Array // ( // [id] => 02 // [name] => orange // ) // [2] => Array // ( // [id] => 01 // [name] => apple // ) // )
参考資料
array_multisort()
の公式マニュアルは下記です。https://www.php.net/manual/ja/function.array-multisort.php
最後に
DBからの取得結果をPHPで並び替えるにはどうしたらいいんだろう、と調べたのがきっかけでarray_multisort()
を知りました。しかし、最初は使い方がいまいち理解できずでしたが、サンプルを実装してみたり、ブログに書いてみることで理解できました。最後になりますが本ブログでは、PHP、フロントエンド、Python、インフラ、サーバー、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!