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件)
- 最新から表示
- 回答順に表示
No.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);
No.2
- 回答日時:
> 例えばソートする際に濁点を自動的に外してくれる・・・など。
sort関数ではカバーできないと思います。
関数を自作するなど、個々に対応するしかなさそうです。
そうですか・・。
関数を作るか、ふりがなフィールドに濁点なしの単語を入れてそれをソートする際に使うことといたします。
どうもありがとうございました。
No.1
- 回答日時:
もし、一文字目だけに濁点がくるのであれば
一文字目だけ退避してからソートして元に戻す。
どこにくるのかわからないのであれば
文字列から濁点文字だけ濁点なしに置き換えてソートし同じく元に戻す。
後者ならば結構面倒ですね。
ありがとうございます。
振り仮名用のフィールドを作ってあるので、そこに下記のように入力し、そのフィールドを使ってソートするとうまく出来ました。
しこう->しこう
じこあ->しこあ
じごい->しこい
ただ、データ量がかなり多いので、自動的にうまくソートが出来れば・・と思っておりましたが、sortファンクションではそこまでカバー出来ないのでしょうか・・。例えばソートする際に濁点を自動的に外してくれる・・・など。
ご存知でしたら教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ワードプレスサイト PHP8.0.25でのWarningエラー 1 2023/06/12 11:44
- JavaScript 2段階プルダウンで1段階目の選択を終えた後に選択ボックスを見えなくしたい 2 2022/07/05 21:58
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- 統計学 生物統計学の質問 7 2022/05/17 13:59
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/10/03 09:55
- その他(プログラミング・Web制作) pythonをjupiter notebookからmecabで頻出の高い単語の抽出について(Runt 1 2022/12/17 18:08
- 英語 SPECS の所の LENGTH というのは、BARREL LENGTH なのか?全体の長さなのか? 1 2022/04/27 20:05
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/04 10:48
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CArrayの要素としてCStringArra...
-
foreachの実行結果について
-
C言語の配列をPush(追加)する...
-
forとかで連番の変数を一気に格...
-
濁点のソート
-
配列参照で$my_var=f('b')みた...
-
array(array()); 多次元配列初...
-
一度に複数の値を取得できる乱...
-
特定の文からメールアドレスの...
-
配列の添え字が小数だとどうなる?
-
Smartyでインクリメント
-
String だと「 ByRef引数の型が...
-
多次元配列の中で条件に合う要...
-
PHP 多次元配列変数のデータ受...
-
PHPにてクラスを配列にすること...
-
While文を使って配列の中身を全...
-
PHP SimpleXml unsetについて
-
テキストデータから指定行の削除
-
foreachのなかで次のキーを参照...
-
別ファイルの構造体の値を読み...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングのPythonのnoteb...
-
C言語の配列をPush(追加)する...
-
php で1から100までの素数の表...
-
STLのvectorで作った配列をメン...
-
スカラーのベクトル微分
-
行列
-
Perlで重複行を削除したい
-
配列の要素(value)に、変数を...
-
特定の文からメールアドレスの...
-
forとかで連番の変数を一気に格...
-
C言語 最大値と最小値を求めて...
-
CArrayの要素としてCStringArra...
-
PHPでユニークIDを作る
-
fgetc関数について
-
読み(あ行~わ行)ごとに分け...
-
Pager::factory()の使い方がわ...
-
verilogで、配列の一部をタスク...
-
mallocで char *型の配列を確...
-
c言語 単位行列
-
連想配列で値が空だったら、要...
おすすめ情報