文字列が1000個ほど $X に配列として格納されていて、
その文字列について、以下のように2次元配列化されている
文字列を置換するというプログラムを作ってください。
$s[1][chikanmae] を $s[1][chikanato]に、
$s[2][chikanmae] を $s[2][chikanato]に、
$s[3][chikanmae] を $s[3][chikanato]に、
(以下略)
$s[n][chikanmae] を $s[n][chikanato]に
それぞれ置換するという物です。
ただし置換する文字列や対象文字列などには
マルチバイトが一切含まれてないので、
個人的にはsrip_replaceがいいのかなと思うのですが、
他にふさわしい関数がある場合はそちらを使ってご回答ください。
なおXP、PHP5を使用しています。
2次元配列化されていているものを1000個以上
処理するということに頭が混乱しています。
またどの関数がふさわしいかということも迷ってます。
以上の点をご配慮の上、ご回答くださいますよう
よろしくお願いします。
foreach($s as $val){
$val[chikanmae] = $val[chikanato];
}
これではダメですか?
srip_replaceというのはstr_replaceのことでしょうか。
http://php.quus.net/strings/str_replace.php
こちらに詳しく書いてあります
正規表現などを必要としない置換であれば私もstr_replaceで行うと思います。
こんな感じでしょうか。
foreach($x as $key_x => $value_x) {
foreach($s as $value_s) {
$x[$key_x] = str_replace($value_s['chikanmae'],$value_s['chikanmae'],$value_x);
}
}
はずしてたらすみません。
すみません、先ほどの回答見直したらstr_replaceの第二引数間違ってました。
コメントできないので再投稿で重ねてすみません。
foreach($x as $key_x => $value_x) {
foreach($s as $value_s) {
$x[$key_x] = str_replace($value_s['chikanmae'],$value_s['chikanato'],$value_x);
}
}
ですね。
再度のご回答ありがとうございます。
大変勉強になりました。
コメント欄に書き込めないので、回廊欄にて失礼します。
dedaraさんの回答で疑問が残っているのだとすると、要件を確認させてください。
つまり、
$s[1][chikanmae] と $X[1][chikanmae] は同じ、
$s[1][chikanato]] と $X[1][chikanato]] は同じ、
$s[2][chikanmae] と $X[2][chikanmae] は同じ、
$s[2][chikanato]] と $X[2][chikanato]] は同じ、
‥‥
ということですか?
$X[1] = "$s[1][chikanmae]"
$X[2] = "$s[1][chikanato]"
...
というように、配列変数 $X に文字列が格納されているのですか?
$s[1][chikanmae] の添え字 'chikanmae' を 'chikanato' に置き換えたいということですか?
ご回答ありがとうございます。
私の質問の仕方が悪いせいで失礼しました。
もう少し具体的な例をあげます。
Sxに住所の一覧があるとします。
例えば「東京都新宿区1丁目」とか「大阪府西成区3丁目」とかです。
$s[5][chikanmae]=東京、$s[5][chikanato]=関東地方,
$s[20][chikanmae]=大阪、$s[20][chikanato]=関西地方であるなら、
Sxに含まれてる住所のうち、$s[n][chikanmae]を全て、
$s[n][chikanato]に置換したいということです。
つまり「東京」という単語を「関東地方」に置換させて、
「東京都新宿区1丁目」を「関東地方新宿区1丁目」に、
同様に、「大阪府西成区3丁目」を「関西地方西成区3丁目」としたいのです。
説明を簡単にするために漢字を用いていますが、
検索対象や検索語にはマルチバイト文字は含まれてません。
基本的にはこちらのページで回答していただいた物の続きです。
http://q.hatena.ne.jp/1218969562
この時はただの2次元配列でしたが、連想配列にした方が良いと思ったので、
その点だけは変更してあります。
>dedaraさんの回答で疑問が残っているのだとすると、
$xの中にある文字列だけ置換する方法が知りたいということです。
以上、よろしくお願いします。
詳しい要件をありがとうございました。
str_replace を使うのであれば、以下のような感じになります。
foreach ($X as $key=>$val) { $X[$key] = str_replace($s[$key]['chikanmae'], $s[$key]['chikanato'], $val) }
また、大文字・小文字を区別しないのであれば、str_ireplace を使います。
再度のご回答ありがとうございます。
str_ireplaceもとても参考になりました。
ご想像のように str_replace() でやるのがよいでしょう。
ですが、変換前後の値をそれぞれの配列にしなおす作業が必要ですね。
$bfr[5] は '東京都' , $aft[5] は '関東地方'
$bfr[20] は '大阪府' , $aft[20] は '関西地方'
のような配列です。
$bfr = array(); $aft = array(); foreach ($s as $a){ $bfr[] = $a[chikanmae]; $aft[] = $a[chikanato]; } $X = str_replace($bfr, $aft, $X);
脳内デバッグなので、ミスがあったらごめんなさい。
ただし、「大阪府大阪市大阪府立大学前町50番地の4」なんて住所があると
「関西地方大阪市関西地方立大学前町50番地の4」になってしまいます。
そのような可能性がある場合は、preg_replace() を使うとよいでしょう。
http://jp.php.net/manual/ja/function.preg-replace.php
(可能性が無いなら、str_replace() を使うべきとマニュアルにあります。
http://jp.php.net/manual/ja/function.str-replace.php
最初に見つかったモノのみ置換するのなら、
$bfr = array(); $aft = array(); foreach ($s as $a){ $bfr[] = '/'.$a[chikanmae].'/'; $aft[] = $a[chikanato]; } $X = preg_replace($bfr, $aft, $X, 1);
preg 系の場合はパターン文字列(上の例では、$bfr)にメタ文字が現れると予定外の動きをする事になるのでエスケープしておく事が必要です。
http://jp.php.net/manual/ja/function.preg-quote.php
(置換前の単語にそれらが含まれなければ不要です)
以下のように変更します。
$bfr[] = '/'.preg_quote($a[chikanmae], '/').'/';
もしも外国の住所のように空白で区切られており、順序も決まっているものなら、もう少し別のアプローチもあります。(例えば「東京都 千代田区 千代田 1-1-1」)
$xchg = array('東京都'=>'関東地方', '大阪府'=>'関西地方', ...);
のような、置換前をキー、置換後を値 となるような変換用の連想配列をつくって(前述の応用で可能ですよね)
$Xafter = array(); // 変換後の値が入る配列 foreach ($X as $a){ $sep = explode(' ', $a); // 例のようであるなら '東京都' が、$sep[0] に入っている $sep[0] = $xchg[$sep[0]]; // 置換 $Xafter[] = implode(' ', $sep); // 再結合して配列に格納 }
というような事も可能かと思います。
丁寧なご回答ありがとうございます。
うまくいきました。
重複については考えてませんでしたが、
やはりこちらの方がよいでしょう。
いただいた回答を参考にして検討し直すことにします。
ご回答ありがとうございます。
質問文はstr_replaceの書き間違いです。
ご指摘ありがとうございました。
>これではダメですか?
$X 内の文字列について置換を行うというようにしたいのですが、
その部分についてどう処理をしたらよいのでしょうか?
たぶんそれくらいのことは理解するべきなのでしょうが、
まだ学習中の身ですので、教えていただけると幸いです。
以上、よろしくお願いします。