ソートをカスタマイズする

6193 ワード

PHP標準のソート関数は、数値(数字)同士の比較しかできません。

例えば、文字列の中に含まれる数値(数字)でソートしたり、連想配列の2次元目の値でソートしたりするには、自分でアルゴリズムを作る必要があります。

以下は、PHP初心者勉強会のオープンチャットで質問があり、良いサンプルになるので参考例として作ってみました。

質問

「数値を含む文字列」の数値を元に昇順でソートを行いたいのですが、想定通りの結果にならず困っています。
sort()を使用するとアルファベット順でソートされてしまいました。
どなたか教えて頂けないでしょうか?

回答

<?php
//	...
error_reporting(E_ALL);

//	...
$array = [
	'test1',
	'sio520',
	'mirin1000',
	'satou283',
	'shoyu120',
	'hoge',
];

//	...
uasort($array, function($a, $b){
	//	...
	$a1 = $b1 = $match = null;

	//	...
	if( preg_match('/(\d+)/', $a, $match) ){
		$a1 = $match[1];
	}

	//	...
	if( preg_match('/(\d+)/', $b, $match) ){
		$b1 = $match[1];
	}

	//	...
	if( $a1 > $b1 ){
		return 1;
	}else if( $a1 < $b1 ){
		return -1;
	}

	//	...
	return 0;
});

//	...
foreach( $array as $var ){
	echo $var . '<br/>';
}