質問: file(""); foreach ($data as $val) { $pattern0="/^(\d+\s.+?\s)(.*?)(高卒)(@.*?)(\n|$)/"; $pattern1="/^(\d+\s.+?\s)(.*?)(大卒)(@.*?)(\n|$)/"; $pattern2="/^(\d+\s.+?\s)(.*?)(高社)(@.*?)(\n|$)/"; $pattern3="/^(\d+\s.+?\s)(.*?)(大社)(@.*?)(\n|$)/"; if(preg_match("$pattern0","$val")){ $val=("$val".'@'."$koukoh[$key]".'→'); }elseif(preg_match("$pattern1","$val")){ $val=("$val".'@'."$koukoh[$key]".'→'."$daigaku[$key]".'→'); }elseif(preg_match("$pattern2","$val")){ $val=("$val".'@'."$koukoh[$key]".'→'."$shakaijin[$key]".'→'); }elseif(preg_match("$pattern3","$val")){ $val=("$val".'@'."$koukoh[$key]".'→'."$daigaku[$key]".'→'."$shakaijin[$key]".'→'); } } $replacement=("$data"."$pattern"); preg_replace("$pattern","$replacement","$data"); print_r ($replacement); ?> ■出力結果 @高校名 →大学名 →会社名 → ※実際には各名称はランダムに出力されています。 ■要望 〇ファイル (1)data.txt (2)koukoh.txt (3)daigaku.txt (4)shakaijin.txt 「data.txt」の中で高卒、大卒、高社、大社それぞれがある行には行末に、 高卒がある場合は「@→高校名→」という文字列を追加。 大卒がある場合は「@→高校名→大学名→」という文字列を追加。 高社がある場合は「@→高校名→会社名→」という文字列を追加。 大社がある場合は「@→高校名→大学名→会社名→」という文字列を追加。 上記に該当しない行はそのまま何も追加せずに表示する。 ※data.txtは英字、数字、日本語が混在しています。 ※高校名、大学名、会社名は(2)~(4)の行ごとに格納されている〇〇名を ランダムに選択したい。 マッチングはpreg_matchやswitchを使ってみたり、 行末追加はarray_pushなども試してみましたが、うまくいきません。 色々と試していますが、ちょっとパニックに陥っています。 どうかご教授の程、お願い申し上げます。
回答: 気になったことだけで失敬。 $koukoh = file(""); $key = array_rand($koukoh); $daigaku = file(""); $key = array_rand($daigaku); $shakaijin = file(""); $key = array_rand($shakaijin); 元ファイルの行数が全く同じなのが保障されていれば、ランダムなんだし良いかもしれません。そうで無い場合だと$key変数に全てを収めているので、別の配列を指定してしまい、存在しない値を見に行ってしまう場合がありませんか。 $koukoh = file(""); $koukoh_key = array_rand($koukoh); $daigaku = file(""); $daigaku_key = array_rand($daigaku); $shakaijin = file(""); $shakaijin_key = array_rand($shakaijin); などとしたほうが良いかと。