dポイントプレゼントキャンペーン実施中!

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)

どうしたらいいのでしょうか。
教えてください。

A 回答 (3件)

$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);
    • good
    • 0

> 例えばソートする際に濁点を自動的に外してくれる・・・など。



sort関数ではカバーできないと思います。
関数を自作するなど、個々に対応するしかなさそうです。
    • good
    • 0
この回答へのお礼

そうですか・・。
関数を作るか、ふりがなフィールドに濁点なしの単語を入れてそれをソートする際に使うことといたします。

どうもありがとうございました。

お礼日時:2007/03/30 17:35

もし、一文字目だけに濁点がくるのであれば


一文字目だけ退避してからソートして元に戻す。

どこにくるのかわからないのであれば
文字列から濁点文字だけ濁点なしに置き換えてソートし同じく元に戻す。

後者ならば結構面倒ですね。
    • good
    • 0
この回答へのお礼

ありがとうございます。

振り仮名用のフィールドを作ってあるので、そこに下記のように入力し、そのフィールドを使ってソートするとうまく出来ました。
しこう->しこう
じこあ->しこあ
じごい->しこい

ただ、データ量がかなり多いので、自動的にうまくソートが出来れば・・と思っておりましたが、sortファンクションではそこまでカバー出来ないのでしょうか・・。例えばソートする際に濁点を自動的に外してくれる・・・など。

ご存知でしたら教えてください。

お礼日時:2007/03/30 00:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!