in_arrayを使って配列の中身を調べる(掲示板削除機能)
昨日から苦戦中なんですが、他の方のソースを見て書いてみました(ほとんどパッチワークなんだけどね)
参考にさせていただいたのは
の標準掲示板、削除の部分。
Perlのように該当記事だけ削除できるような関数が見当たらないので、逆の方法、つまり削除対象以外の記事を再度ファイルに書き込んで表示し直すと言う方法を採りました。
Perlにはそんな便利な関数があるのか…で、今の自分のスクリプトに合わせて書いたのがこれ
<?php if(($sakujo_no != "") && ($pass != "")){ $delfile = file($log); $fp = fopen($log, "w"); for($i=0; $i<sizeof($delfile); $i++){ list($dcode,$dname,$dcom,$ddate,$dhost) = split( "<>", $delfile[$i]); if ($pwd == $pass) { if ($sakujo_no != $dcode){ fputs($fp,$delfile[$i]); } } else { fputs($fp,$delfile[$i]); } } fclose($fp); } ?>
でもこれだと削除できません。$sakujo_noが配列だからです。そう、チェックボックスで複数選択できなければ意味が無い。
皆、一体どうやってるんだ?と思いましてレッツPHPさんのBBSを見てみる。
どうやら、in_arrayが鍵らしい。
in_arrayという関数を使えば配列の中の値を探し当てることができる!
またもやほとんどコピペで書いてみた
<?php if (($sakujo_no != "") && ($pass != "")){ $delall = file($log); for($i=0; $i<count($delall); $i++) { list($no,) = explode("<>",$delall[$i]); //配列に一致する値があったとき、空のデータを入れる if (in_array($no, $sakujo_no)) $delall[$i] = ""; } // 配列になったものをまとめて書き込み renewlog($delall); } //ファイル書き込みのユーザー定義関数 //参考元にあったロック処理とか消してます function renewlog($delall){ global $log; $rp = fopen($log, "w"); while(list(,$val)=each($delall)){ fputs($rp,$val); } fclose($rp); } ?>
で、複数の記事を一気に消せた!
ちなみに一番最初に出したソースをin_arrayを使って書き換えると
<?php if(($sakujo_no != "") && ($pass != "")){ $delfile = file($log); $fp = fopen($log, "w"); for($i=0; $i<sizeof($delfile); $i++){ list($dcode,$dname,$dcom,$ddate,$dhost) = split( "<>", $delfile[$i]); if ($pwd == $pass) { //↓配列と値が(合致しない時)記事を書き込む if (! in_array($dcode, $sakujo_no)){ fputs($fp,$delfile[$i]); } } else { fputs($fp,$delfile[$i]); } } fclose($fp); } ?>
こうなる。どっちの方法でも動いた!
ファイルのロック等を考えるとレッツPHPさん方式の方がより安全かも。
変数とか参考にさせてもらったソースそのままだし、(というよりソースほぼ全て流用なんですが)
理解はできました。自分なりにもっと書き換えるべきですね。
ともあれ、削除機能もなんとかできた。