動かざることバグの如し

近づきたいよ 君の理想に

Rubyのsort_byをPHPでも使いたい人へ 配列内の値でソート

rubyのsort_byはめっちゃ便利。マジで

ary = [{id: 2,name:"hoge"},{id: 3,name:"hoge"},{id: 1,name:"hoge"}]
p ary.sort_by { |_| _[:id] }
=> [{:id=>1, :name=>"hoge"}, {:id=>2, :name=>"hoge"}, {:id=>3, :name=>"hoge"}]

ぜひこんなメソッドPHPにあればなぁ(希望的観測)で検索したらやっぱりなかった

ってことでPHPメソッドsort_by的な連想配列内の値でソートしてみる

PHP 5.5以降

<?php
// 連想配列のValueでソートしたい
$array[] = ["id"=>4, "name"=>"Hoge"];
$array[] = ["id"=>3, "name"=>"Piyo"];
$array[] = ["id"=>2, "name"=>"Fuga"];
$array[] = ["id"=>1, "name"=>"Foo"];

array_multisort(array_column($array, 'id'), SORT_ASC, $array);
print_r($array);
?>

PHP 5.3以降

<?php
// 連想配列のValueでソートしたい
$array[] = ["id"=>4, "name"=>"Hoge"];
$array[] = ["id"=>3, "name"=>"Piyo"];
$array[] = ["id"=>2, "name"=>"Fuga"];
$array[] = ["id"=>1, "name"=>"Foo"];

array_multisort(array_map(function ($i) { return $i['id']; }, $array), SORT_ASC, $array);

array_map()やarray_column()すら使えない環境下の場合は最悪usortが使える

usort($array, function ($a, $b) { return $a['id'] - $b['id']; });