PHPを使い、下記のような処理を行うプログラムを作ってください。


文字列が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個以上
処理するということに頭が混乱しています。
またどの関数がふさわしいかということも迷ってます。

以上の点をご配慮の上、ご回答くださいますよう
よろしくお願いします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2008/08/20 23:41:00
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答6件)

id:dedara No.1

回答回数30ベストアンサー獲得回数4

ポイント20pt

foreach($s as $val){

  $val[chikanmae] = $val[chikanato];

}

これではダメですか?

srip_replaceというのはstr_replaceのことでしょうか。

http://php.quus.net/strings/str_replace.php

こちらに詳しく書いてあります

id:taroemon

ご回答ありがとうございます。


質問文はstr_replaceの書き間違いです。

ご指摘ありがとうございました。


>これではダメですか?

$X 内の文字列について置換を行うというようにしたいのですが、

その部分についてどう処理をしたらよいのでしょうか?

たぶんそれくらいのことは理解するべきなのでしょうが、

まだ学習中の身ですので、教えていただけると幸いです。


以上、よろしくお願いします。

2008/08/20 03:24:51
id:masashi0316 No.2

回答回数16ベストアンサー獲得回数0

ポイント20pt

正規表現などを必要としない置換であれば私も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);

}

}

はずしてたらすみません。

http://php.quus.net/strings/str_replace.php

id:masashi0316 No.3

回答回数16ベストアンサー獲得回数0

ポイント18pt

すみません、先ほどの回答見直したら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);

}

}

ですね。

http://php.quus.net/strings/str_replace.php

id:taroemon

再度のご回答ありがとうございます。

大変勉強になりました。

2008/08/20 22:36:51
id:pahoo No.4

回答回数5960ベストアンサー獲得回数633

ポイント18pt

コメント欄に書き込めないので、回廊欄にて失礼します。

dedaraさんの回答で疑問が残っているのだとすると、要件を確認させてください。


1.ご質問にある配列変数 $X と $s は同じことを意味していますか?

つまり、

$s[1][chikanmae] と $X[1][chikanmae] は同じ、

$s[1][chikanato]] と $X[1][chikanato]] は同じ、

$s[2][chikanmae] と $X[2][chikanmae] は同じ、

$s[2][chikanato]] と $X[2][chikanato]] は同じ、

‥‥

ということですか?


2.それとも、

$X[1] = "$s[1][chikanmae]"

$X[2] = "$s[1][chikanato]"

...

というように、配列変数 $X に文字列が格納されているのですか?


3.はたまた、

$s[1][chikanmae] の添え字 'chikanmae' を 'chikanato' に置き換えたいということですか?

id:taroemon

ご回答ありがとうございます。

私の質問の仕方が悪いせいで失礼しました。

もう少し具体的な例をあげます。


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の中にある文字列だけ置換する方法が知りたいということです。


以上、よろしくお願いします。

2008/08/20 12:45:05
id:pahoo No.5

回答回数5960ベストアンサー獲得回数633

ポイント18pt

詳しい要件をありがとうございました。

str_replace を使うのであれば、以下のような感じになります。

foreach ($X as $key=>$val) {
    $X[$key] = str_replace($s[$key]['chikanmae'], $s[$key]['chikanato'], $val)
}

また、大文字・小文字を区別しないのであれば、str_ireplace を使います。

id:taroemon

再度のご回答ありがとうございます。

str_ireplaceもとても参考になりました。

2008/08/20 22:43:11
id:tezcello No.6

回答回数460ベストアンサー獲得回数69

ポイント70pt

ご想像のように 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);  // 再結合して配列に格納

}

というような事も可能かと思います。

http://jp.php.net/manual/ja/function.explode.php

http://jp.php.net/manual/ja/function.implode.php

id:taroemon

丁寧なご回答ありがとうございます。

うまくいきました。


重複については考えてませんでしたが、

やはりこちらの方がよいでしょう。

いただいた回答を参考にして検討し直すことにします。

2008/08/20 23:39:33

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません