SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...

【PHP】SQLの結果をソートする

問題

SQLで取得した結果を、phpでソートしたいです

答え

array_multisort が使えます。

SQLでソートするとすごく遅いなどの場合に
結果を全取得しても問題ないくらいであれば、
PHPでソートすることで速度の問題を解決できることも多いです。

以下のようなテーブルがあるとき、

id column1 column2 column3
1 1 1 1
2 1 1 2
3 1 2 1
4 1 2 2
5 2 1 1
6 2 1 2
7 2 2 1
8 2 2 2

カラム2の降順、IDの降順にソートする場合は

$pdoStatement = $this->pdo->query("SELECT * FROM test_sort");
// 全件取得
$dataCollection = $pdoStatement->fetchAll();

// 結果のキーとソートするカラムの値の配列を作って
$sortKey1Column2 = [];
$sortKey2Id      = [];

foreach ($dataCollection as $key => $row)
{
    $sortKey1Column2[ $key ] = $row->column2;
    $sortKey2Id[ $key ]      = $row->id;
}

// $dataCollection をソートする
// 自動判別(数値)で良いときは SORT_STRING は指定不要
array_multisort(
    $sortKey1Column2 , SORT_DESC , SORT_STRING,
    $sortKey2Id      , SORT_DESC , SORT_STRING,
    $dataCollection
);

結果は以下

array (
0 =>
(object) array(
  'id' => '8',
  'column1' => '2',
  'column2' => '2',
  'column3' => '2',
),
1 =>
(object) array(
  'id' => '7',
  'column1' => '2',
  'column2' => '2',
  'column3' => '1',
),
2 =>
(object) array(
  'id' => '4',
  'column1' => '1',
  'column2' => '2',
  'column3' => '2',
),
3 =>
(object) array(
  'id' => '3',
  'column1' => '1',
  'column2' => '2',
  'column3' => '1',
),
4 =>
(object) array(
  'id' => '6',
  'column1' => '2',
  'column2' => '1',
  'column3' => '2',
),
5 =>
(object) array(
  'id' => '5',
  'column1' => '2',
  'column2' => '1',
  'column3' => '1',
),
6 =>
(object) array(
  'id' => '2',
  'column1' => '1',
  'column2' => '1',
  'column3' => '2',
),
7 =>
(object) array(
  'id' => '1',
  'column1' => '1',
  'column2' => '1',
  'column3' => '1',
),
)

関連するメモ

コメント