[PHP]ひらがな・カタカナ、大文字・小文字を区別しないソート(並べ替え)

Pocket

標準関数の sort() を使ってひらがな・カタカナの混在する文字列をソートすると、以下のように ひらがな が先、カタカナ が後となるように並び替えられます。

いちご
ぶどう
りんご
オレンジ
バナナ

アルファベットの大文字小文字に関しても同様で、大文字が優先で次に小文字という順番になるため「a, B, c」と並べたくても「B, a, c」となってしまいます。

ひらがな・カタカナ、大文字・小文字を区別せず五十音順に並び替えたい場合など、ソート方法を細かく指定してユーザー独自のルールを作るには usort() を用います。

<?php
$list = [
    'りんご',
    'オレンジ',
    'ぶどう',
    'いちご',
    'バナナ',
];

usort($list, function($a, $b){
    $a = mb_convert_kana($a, 'c');
    $b = mb_convert_kana($b, 'c');
    return strcasecmp($a, $b);
});

print_r($list);
いちご
オレンジ
バナナ
ぶどう
りんご

配列から2つずつ値を取り出し、どちらも同じ時は 0、最初の引数のほうがが大きい時は正の数、二番目の引数のほうが大きい時は府の値を返すようにします。
この処理自体は標準関数 strcmp() が用意されているので、そちらを使うと sort() と全く同じ結果を得ることが出来ます。strcmp() の代わりに strcasecmp() を用いるとアルファベットの大文字・小文字の区別なくソートすることが出来ます。

ひらがなとカタカナの区別をなくす場合両方の値をひらがなかカタカナのどちらかに変換して統一してから比較するようにします。このような変換処理には mb_convert_kana() が使えます。

rsort() のように逆順にソートしたい場合は -1 * strcasecmp($a, $b); のようにして正負を逆転させます。


Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です