- 締切済み
濁点のソート
PHPで濁点のソートがうまく出来なくて困っております。 データは下記のような形で入っています。 $temp_array=array("じごい","じこあ","しこう"); sort($temp_array); var_dump($temp_array); 結果は下記のようになってしまいます。 array 0 => string 'しこう' (length=9) 1 => string 'じこあ' (length=9) 2 => string 'じごい' (length=9) 本来であれば濁点を無視した下記のようなソート順にしたいのです。 array 0 => string 'じこあ' (length=9) 1 => string 'じごい' (length=9) 2 => string 'しこう' (length=9) どうしたらいいのでしょうか。 教えてください。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- i2719
- ベストアンサー率35% (11/31)
$table=array('こ'=>'こ','ご'=>'こ','し'=>'し','じ'=>'し'); function cmp($a, $b) { global $table; $c=strcmp($a,$b); if ($c==0) return 0; $la=mb_strlen($a); $lb=mb_strlen($b); $len=min($la,$lb); for($i=0;$i<$len;$i++){ $ai=mb_substr($a, $i, 1); $bi=mb_substr($b, $i, 1); $ci=strcmp($ai,$bi); if($ci!=0){ if(array_key_exists($ai,$table) && array_key_exists($bi,$table)) { $ct=strcmp($table[$ai],$table[$bi]); if ($ct!=0) return $ct; } else { return $ci; } } } return $c; } $temp_array=array("じごい","じこあ","しこう"); usort($temp_array,'cmp'); var_dump($temp_array);
- totsugiino
- ベストアンサー率37% (6/16)
> 例えばソートする際に濁点を自動的に外してくれる・・・など。 sort関数ではカバーできないと思います。 関数を自作するなど、個々に対応するしかなさそうです。
- calltella
- ベストアンサー率49% (317/635)
もし、一文字目だけに濁点がくるのであれば 一文字目だけ退避してからソートして元に戻す。 どこにくるのかわからないのであれば 文字列から濁点文字だけ濁点なしに置き換えてソートし同じく元に戻す。 後者ならば結構面倒ですね。
お礼
ありがとうございます。 振り仮名用のフィールドを作ってあるので、そこに下記のように入力し、そのフィールドを使ってソートするとうまく出来ました。 しこう->しこう じこあ->しこあ じごい->しこい ただ、データ量がかなり多いので、自動的にうまくソートが出来れば・・と思っておりましたが、sortファンクションではそこまでカバー出来ないのでしょうか・・。例えばソートする際に濁点を自動的に外してくれる・・・など。 ご存知でしたら教えてください。
お礼
そうですか・・。 関数を作るか、ふりがなフィールドに濁点なしの単語を入れてそれをソートする際に使うことといたします。 どうもありがとうございました。