コードロード

エラー討伐

【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

参考

[PHP]自在に多次元配列をソートできるarray_multisort

【PHP】多次元配列を並び替える方法 - Qiita