漢数字のソート
漢数字をソートすると数字順に並ばなくて残念な感じになるので一から九まで並ぶようにしてみました。一旦アラビア数字に置き換えてからソート、漢字に戻すという単純な方法です。元からあるアラビア数値が漢数字に置換されないように @1@ のように記号で囲っています。
webアプリで選択候補を漢数字順に並べる目的で作ったので大量のデータをソートすることは考慮していません。
ソース
<?php function kanji_num_sort($list) { foreach($list as $k => $v) { $list[$k] = _convertKanjiNum2Num($v); } asort($list); foreach($list as $k => $v) { $list[$k] = _convertNum2KanjiNum($v); } return $list; } function _convertKanjiNum2Num($str) { $str = str_replace('一', '@1@', $str); $str = str_replace('二', '@2@', $str); $str = str_replace('三', '@3@', $str); $str = str_replace('四', '@4@', $str); $str = str_replace('五', '@5@', $str); $str = str_replace('六', '@6@', $str); $str = str_replace('七', '@7@', $str); $str = str_replace('八', '@8@', $str); $str = str_replace('九', '@9@', $str); return $str; } function _convertNum2KanjiNum($str) { $str = str_replace('@1@', '一', $str); $str = str_replace('@2@', '二', $str); $str = str_replace('@3@', '三', $str); $str = str_replace('@4@', '四', $str); $str = str_replace('@5@', '五', $str); $str = str_replace('@6@', '六', $str); $str = str_replace('@7@', '七', $str); $str = str_replace('@8@', '八', $str); $str = str_replace('@9@', '九', $str); return $str; } $list = array('九', '一', '八', '二', '七', '三', '六', '四', '五'); asort($list); print_r($list); // 数字順に並ばない! echo "<br/>\n"; echo "<br/>\n"; $list = array('九', '一', '八', '二', '七', '三', '六', '四', '五'); $list = kanji_num_sort($list); print_r($list); // 数字順に並ぶ! ?>
出力結果
// asort Array ( [1] => 一 [4] => 七 [5] => 三 [0] => 九 [3] => 二 [8] => 五 [2] => 八 [6] => 六 [7] => 四 ) // kanji_num_sort Array ( [1] => 一 [3] => 二 [5] => 三 [7] => 四 [8] => 五 [6] => 六 [4] => 七 [2] => 八 [0] => 九 )