make is.dev make it simple. development.
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()でコールバック関数に渡されるのは値ではなくキーになる事に注意。