ファイル操作処理を一般化する関数func_registを作成したい
今回作成したのはlog.datに 名前、年齢、電話番号を<>で区切って登録するプログラムです。
すでに登録してある場合はエラーを出します。
この処理を一般化し、好きなファイル名、任意の配列、チェックするデータ、重複時のメッセージを関数として処理を作りたいです。
どのようにすればよいでしょうか?
今回一般化したい処理は$file , $insertの部分、重複チェックする変数,重複時メッセージ
の4つです。
まず、一般化する前の処理を記載します。
PHP
1$name = "田中太郎"; 2$age = "15"; 3$tel = "09012345678"; 4 5 6$file = "./log.dat"; 7$file_array = file($file); 8foreach($file_array as $value){ 9list($list_name,$list_age,$list_tel) = explode('<>', $value); 10if($name == $list_name){ 11$flag = 1; 12} 13} 14if($flag) exit("お客様のお名前は登録済みです。"); 15$fp = fopen($file ,"r+") or exit("log.datが開けません"); 16if($fp && flock($fp, LOCK_EX)){ 17$insert = implode('<>', array($name,$age,$tel,"\n")); 18array_unshift($file_array,$insert); 19rewind($fp); 20ftruncate($fp,0); 21for($i=0; $i<count($file_array); $i++) { 22fwrite($fp, $file_array[$i]); 23} 24fclose($fp); 25} 26echo "登録しました。";
一般化する前のこの処理を実行すれば新規登録の場合は「登録しました」と表示されます。
次に一般化する関数func_registを作成した際には
使うときには
PHP
1$name = "田中太郎"; 2$age = "15"; 3$tel = "09012345678"; 4$file = "./log.dat"; 5$list = array($name,$age,$tel); 6$errmsg = "お客様のお名前は登録済みです。"; 7func_regist($file,$list,$check,$errmsg);
一般化していると、これを次のように使えるようにしたいです。
生徒の名前<>学年<>テストの成績
をscore.datに保存する。新しく追加するときは $student_name , $rank , $score として追加する
例として、山田太郎君、小学6年生、80点とします。
PHP
1$name = "山田次郎"; 2$rank = "6"; 3$score = "80"; 4$file = "./score.dat"; 5$data = list($name,$rank,$score); 6$check = $name; 7$errmsg = "その生徒の名前は登録済みです"; 8func_regist($file,$data,$check,$errmsg);
このfunc_regist関数にはどのように書けばよいか教えてください。
追記:自分で作ってみたコードです。
PHP
1list($list_name,$list_age,$list_tel) = explode('<>', $value);
と書いていたところを一般化するときは
PHP
1「$list_name,$list_age,$list_tel」
をデータとして渡す必要があります
それがわかりません。
また、これが渡せないと
重複のチェックであるこの部分がかけません。
PHP
1if($name == $list_name){ 2$flag = 1; 3}
PHP
1name = "田中太郎"; 2$age = "15"; 3$tel = "09012345678"; 4$insert = implode('<>', array($name,$age,$tel,"\n")); 5$data = array($name,$age,$tel); 6 7func_regist("./log.dat",$data,$name,$insert,"その生徒の名前は登録済み"); 8 9 10 11function func_regist($file , array $data , $check, $insert,$errmsg){ 12$file_array = file($file); 13foreach($file_array as $value){ 14//list($data) = explode('<>', $value); 15//この処理をどうすればよいか 16echo "list_name:".$list_name; 17if($name == $list_name){ 18$flag = 1; 19} 20} 21if($flag) exit($errmsg); 22$fp = fopen($file ,"r+") or exit("{$file}が開けません"); 23if($fp && flock($fp, LOCK_EX)){ 24array_unshift($file_array,$insert); 25rewind($fp); 26ftruncate($fp,0); 27for($i=0; $i<count($file_array); $i++) { 28fwrite($fp, $file_array[$i]); 29} 30fclose($fp); 31} 32echo "登録しました。"; 33 34 35 36} 37
ここの処理をどうかくか の部分を教えてください
list()の中身は変数として1つ1つしかいれられません。
list (array ($data)) = explode('<>', $value);
とできたら理想なのですが・・・
listで分割する変数を関数外から呼び出したいです。
ループの中で
echo "list_name:".$list_name;
と出力してもNULLになります。
2回目のアクセス時にはlist_nameにはすでに登録されている「田中太郎」と出力されたいです。