😀
ソートをカスタマイズする
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/>';
}
Discussion