2024年9月19日
配列をソートする
PHPで配列をソートする。
使用環境
・ PHP 8.2.9
シンプルな配列のソート
<?php
// ランダムな配列用意
$vs = range( 1, 10 );
shuffle( $vs );
// 昇順に並べ替える(キーは維持せず)
sort( $vs );
var_dump( $vs );
// 昇順に並べ替える(キーは維持)
asort( $vs );
var_dump( $vs );
// 降順に並べ替える(キーは維持せず)
rsort( $vs );
var_dump( $vs );
// 降順に並べ替える(キーは維持)
arsort( $vs );
var_dump( $vs );
PHP連想配列のソート
<?php
// ランダムな連想配列用意
$vs = [
'a' => 3,
'b' => 5,
'c' => 2,
'd' => 1,
'e' => 4,
];
// 昇順に並べ替える(キーは維持)
asort( $vs );
var_dump( $vs );
// 降順に並べ替える(キーは維持)
arsort( $vs );
var_dump( $vs );
PHP連想配列の場合、通常キーは維持しておきたいはずなので、asort()、arsort()、を使う。
キーはそのままに並びだけ変わる。
多次元の連想配列やクラスの場合
値の比較がそのままでは難しい場合、usort()、uasort()、を使う。
比較結果をコールバック関数で入れ込む必要がある。
<?php
// ランダムな連想配列用意
$vs = [
'a' => range( 1, 5 ), // sum=15
'b' => range( 2, 4 ), // sum=9
'c' => range( 1, 10 ), // sum=55
'd' => range( 6, 9 ), // sum=30
'e' => range( 10, 12 ), // sum=33
];
// 合計値で昇順に並べ替える(キーは維持。維持しない場合はusort()でOK)
uasort(
$vs,
function( $v1, $v2 ) {
// 各合計値算出
$v1sum = array_sum( $v1 );
$v2sum = array_sum( $v2 );
// v1 > v2 の時1を返す(正数ならOK)
if ( $v1sum > $v2sum ) {
return 1;
}
// v1 < v2 の時-1を返す(負数ならOK)
elseif ( $v1sum < $v2sum ) {
return -1;
}
// v1 = v2 の時0を返す
return 0;
}
);
var_dump( array_keys( $vs ) );
PHPコールバック関数は比較対象2つのデータを受け取り、比較結果を正数、負数、0で返すよう実装する。
昇順/降順の分けはないので、ここの返却値でコントロールする。
コールバック関数は配列の要素数より多く実行されるので、重たい処理を書くと処理が遅くなる。
場合によっては事前に計算して配列の中に入れて置き、それを使って大小判定した方が良い。
値ではなくキーでソートしたい場合
キーでソートする場合、ksort()、krsort()、uksort()、を使う。
(当然、キーは維持される)
使い方は上記と同様だが、uksort()でコールバック関数に渡されるのは値ではなくキーになる事に注意。