PHPで連想配列の配列のソート

PHPには配列をソートする様々な関数があります。
PHP: 配列のソート – Manual

連想配列の配列をソートしたい

$users = array(
	array(
		'id' => 1,
		'username' => 'katty0324',
		'following' => 191,
		'follower' => 612
	),
	array(
		'id' => 2,
		'username' => 'yutomukoyama',
		'following' => 947,
		'follower' => 1840
	),
	array(
		'id' => 3,
		'username' => 't_ishiyama',
		'following' => 560,
		'follower' => 746
	),
);

こういうユーザー一覧みたいな配列をソートしたくなることがありますよね。データベースから取り出した直後の状態っていうのはだいたいこんな感じですし。たとえばユーザーID順であったり、フォロワー数順であったり。
この変数$usersは言葉で説明すると「連想配列の配列」です。標準のソート関数は「配列」または「連想配列」のソートにしか対応していないので、この「連想配列の配列」をソートすることはできません。

泥臭い方法

foreach ($users as $index => $user)
	$index2following[$index] = $user['following'];
arsort($index2following);
$ret = array();
foreach ($index2following as $index => $following)
	$ret[] = $users[$index];

arsortとは、連想配列(Associative array)を逆順(Reverse)に並べる(Sort)関数です。
元の「連想配列の配列」を一度「連想配列」にします。そしてそれをソートして、その並び順を見ながら「連想配列の配列」に戻す、ということをしています。こうすれば確かにソートできますが、ソートするだけでこんなにたくさん書いていたらソースコードめちゃくちゃになってしまいます。

usortを使えば一発

usortは独自に定義した関数を元にソートを実行できます。

usort($users, function($a, $b) {
	return $a['following'] < $b['following'];
});

usortを使うと楽ですし見通しも立ちやすくなります。
確か、PHP5.2までは無名関数が使えないので、別途関数を定義しなければならず、usortを使ってもやはり少し読みづらいコードになります。

// PHP5.2以前の塲合
usort($users, 'sort_by_following');
function sort_by_following($a, $b) {
	return $a['following'] < $b['following'];
}

PHP5.3からは無名関数が使えるようになったので、つまり上のように関数の引数にそのまま関数を渡せるようになったので、これを使わない手はないですね!

コメント

タイトルとURLをコピーしました