【PHP】多次元配列を並び替えて、指定番目から指定件数のみ切り取った配列を取得
やりたいこと
PHPで、多次元配列があって、指定したキーの値で、昇順・降順の並び替えができるようにしたかった。 並び替えの後、指定した番目から指定した件数分の要素だけを取得したかった。 つまり、ページネーションのイメージ。
SQLでやればこんな感じですぐにできるが、色々あってPHPで処理することとなった。
SELECT * FROM users ORDER BY age ASC LIMIT 2, 2
$array = [ [ 'name'=> 'kenta', 'age' => 20 ], [ 'name'=> 'taro', 'age' => 10 ], [ 'name'=> 'yuki', 'age' => 15 ], [ 'name'=> 'hanako', 'age' => 25 ], [ 'name'=> 'yuji', 'age' => 30 ], ];
結論
こんな感じの関数を作った。
/** * 配列の指定番目から指定数を切り取って返す * * @param int $start * @param int $max * @param array $array * @return array */ function cutStartToMaxArray($start, $max, $array) { $tmp_array = []; for ($i = $start; $i <= count($array) - 1; $i++) { if (count($tmp_array) > $max - 1) { break; } $tmp_array[] = $array[$i]; } return $tmp_array; } /** * キーを指定してその値をもとに、多次元配列をソートして返す * * @param string $target_key * @param string $order SORT_ASC or SORT_DESC * @param string $type SORT_REGULAR or SORT_NUMERIC or SORT_STRING etc... * @param array $array * @return array */ function orderMultiArray($target_key, $order, $type, $array) { foreach ($array as $k => $v) { $order_target_array[] = $v[$target_key]; } array_multisort($order_target_array, $order, $type, $array); return $array; } $start_limit = 2; // 配列の何番目からスタート $max_count = 2; // データ数 $ordered_array = orderMultiArray('age', SORT_DESC, SORT_NUMERIC, $array) $new_array = cutStartToMaxArray($start_limit, $max_count, $ordered_array); var_dump($new_array);
// 結果 // ageで並び替えた2ページ目の2人分($new_array[2]と$new_array[3])のデータを取得 array (size=2) 0 => array (size=2) 'name' => string 'kenta' (length=5) 'age' => int 20 1 => array (size=2) 'name' => string 'hanako' (length=6) 'age' => int 25