
今自分で関数を作成しているのですが、文字列(丸数字)の文字化けにかなり苦しんでいます。
(※注※)これ以降(1)など()の中に数字を入れて記述しているものは実際のソースコード上では丸数字で記入してます。教えてgooでは丸数字が記述できないようでして…
関数の内容としては、(1)あ(2)い(3)う……このように丸数字で区切られている文字列を配列名を$dataとすると、$data[0]には「あ」、$data[1]には「い」、$data[2]には「う」が入るような関数を作成しています。
この丸数字の数は(10)まで対応させようと考えてます。
実際のソースは
function bunkai($str1){
if (strstr($str1, "(10)") != NULL){
define("kugiri","(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)"); // 区切り文字
}else if (strstr($str1, "(9)") != NULL){
define("kugiri","(1)(2)(3)(4)(5)(6)(7)(8)(9)"); // 区切り文字
}else if (strstr($str1, "(8)") != NULL){
define("kugiri","(1)(2)(3)(4)(5)(6)(7)(8)"); // 区切り文字
}else if (strstr($str1, "(7)") != NULL){
define("kugiri","(1)(2)(3)(4)(5)(6)(7)"); // 区切り文字
}else if (strstr($str1, "(6)") != NULL){
define("kugiri","(1)(2)(3)(4)(5)(6)"); // 区切り文字
}else if (strstr($str1, "(5)") != NULL){
define("kugiri","(1)(2)(3)(4)(5)"); // 区切り文字
}else if (strstr($str1, "(4)") != NULL){
define("kugiri","(1)(2)(3)(4)"); // 区切り文字
}else if (strstr($str1, "(3)") != NULL){
define("kugiri","(1)(2)(3)"); // 区切り文字
}else if (strstr($str1, "(2)") != NULL){
define("kugiri","(1)(2)"); // 区切り文字
}else if (strstr($str1, "(1)") != NULL){
define("kugiri","(1)"); // 区切り文字
}
$count = 0;
$token = strtok($str1, kugiri);
while ($token) {
$data[$count] = $token;
$token = strtok(kugiri);
$count++;
}
$data[$count] = NULL;
return $data;
}
なんですが、
$str1に"(3)した(名)(4)しも(名)(5)もと(名)(6)さ-げる(動ガ下一)(7)さ-がる(動ガ下一)(8)くだ-る(動ラ五[四])(9)くだ-す(動サ五[四])(10)くだ-さる(動ラ五[四])"という文字列を入れて
$dataを表示させてみると
$data[0]=した(名)
$data[1]=しも(名)
ここまではできるのですが、これ以降
$data[2]=も�
$data[3]=(名)
$data[4]=さ-げる(動ガ下一)
$data[5]=さ-がる(動ガ下一)
$data[6]=く�
$data[7]=-る(動�
:
:
となってしまい、ところどころでうまく丸数字を読み込めていません。特に$str1に違う文字列をいれてみても(1)(2)(3)(4)まではきちんと読み込めてその後の(5)でまず最初の文字化けが絶対発生してしまいます。でも(5)を通過したあとの(6)(7)はきちんと判別していたりとよく原因がわかりません……。
がんばってexplode関数で同じようなことしてもいいかなと考えているのですが、関数自体が長くなってしまうので、めんどくさいなーと思います。
どなたか、このバグの原因がわかるかた、または、こんな関数を使ってこんなことしたら丸数字を判別して配列に入れることができるよーという意見もあったら欲しいです。
お願いします。困ってます。

No.3ベストアンサー
- 回答日時:
じゃ、こんな感じで・・・
function bunkai($str1){
$data=explode('__SEPRATOR__',str_replace(Array("(1)","(2)","(3)","(4)","(5)","(6)","(7)","(8)","(9)","(10)"),'__SEPRATOR__',$str1));
array_shift($data);
return $data;
}
yambejpさんのおっしゃるとおりに実行してみたらきちんとに判別されて配列に入りました。
ありがとうございます~!非常に助かりました!!
このことで1日中悩んでいましたが、みなさんのおかげで解決しました~ありがとうございます~
No.2
- 回答日時:
もしもshift-jisを使用しているのなら5c問題かもしれませんが
マルチバイト文字を扱うのなら素直にマルチバイト文字列用の
関数を使用したほうが無難だと思います。
開示している関数は、下記2行で書けます
$data=mb_split('[(1)-(10)]',$str1);
array_shift($data);
$dataが所望の配列になっていると思います
注)()数字は、○数字に変更のこと
mpxさんの言うとおり
function bunkai($str1){
$data=mb_split('[(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)]',$str1);
array_shift($data);
return $data;
}
としてみましたが、うまく$dataに値が入りませんでした。
使い方が間違っているのでしょうか?やはり丸数字は使わないほうがいいのでしょうか…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FortranのOPEN文
-
自動で番号を振りたい
-
テキストデータから指定行の削除
-
While文を使って配列の中身を全...
-
PHPのプルダウン式のジャンプ設...
-
配列のランク付け
-
PHPのループ数限界値について
-
重複しないランダム関数を教え...
-
ユーザー定義関数について
-
日付から順にデータを並び替えたい
-
PHPのカッコ[ ]の使い方について
-
pythonのnumpyでの繰り返しでの...
-
verilogで、配列の一部をタスク...
-
phpでforeachの中にforeachがあ...
-
PHPで連想配列のプルダウンメニ...
-
占いのPHPを作成中ですが・・・
-
「ローマ字 -> ひらがな」へPHP...
-
ファイルの逆読みってできますか?
-
Smarty の演算方法
-
配列をループでたくさん宣言し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHP 別ドメインへのファイル保存法
-
Resource id #3 と表示されま...
-
別ファイルの構造体の値を読み...
-
C言語でCSVファイルの行数を読...
-
自動で番号を振りたい
-
ヒアドキュメントの中のfor文
-
csvの内容を行単位で削除したい
-
ログファイルが一定行数を超え...
-
【PHP】csvファイルへの書き出...
-
配列同士の足し算のループ処理
-
掲示板のコメント削除
-
バイナリファイルの内容を、そ...
-
FortranのOPEN文
-
pythonのファイルの並びでの読...
-
配列をファイルに書き込む方法
-
文字列(丸数字)の文字化けに...
-
CSVファイルの最終行のデー...
-
複数行のデータのPOST処理に関して
-
doxygenを使用する環境について
-
PHPでCSVの一部の行を編集したい
おすすめ情報