実験)DBを使わないで同じ処理をしようとすると・・・

自分のbotで、フォロワーさんからお願いされた事を覚えておいて、後でお仕事する的なことをやってみたことがあるのですがDBのテーブルを利用して実装してしまったので、もし普通のファイルを利用したらどうなるかなとちょっと考えてみました。
seriarizeかCSVファイル形式でデータを保持して、プログラム中で配列に展開してメンテナンスするのが、簡単かなとゴニョゴニョやってみましたが、出来上がったファイルを人間が見て直感的にわかりやすいと言う意味ではCSVが良さそうかなーと言うわけで


fgetcsvfputcsvを利用してみる。*1

[CSVファイルを読み込む]

<?php
function open_kiroku_file_csv($file_name){

echo $file_name."(CSV)ファイルをオープンする<br>";
     $buf_kiroku=array();
     if(($fp=fopen($file_name,"r"))!=false){
          $i=0;
          while(($buf_line=fgetcsv($fp,100,","))!==false){
//               echo "取得データ[".$i."]<br>";
//               var_dump($buf_line);               
               $buf_kiroku[$i]=(array)$buf_line;
               $i++;
          }
          fclose($fp);
     }
     
     echo "記録ファイルを読み込み-----終了";
     var_dump($buf_kiroku);
     return ($buf_kiroku);
}
?>

[引数として与えられた二次元配列をCSVファイルを書き出す]

<?php
function update_kiroku_file_csv($file_name,$buf_kiroku){

     echo $file_name"(CSV)ファイルへ配列書き出し処理前<br>";
//     var_dump($buf_kiroku);
     if(($fp=fopen($file_name,"w"))!=false){
          foreach ($buf_kiroku as $line) {
//               echo "1行づつ書き出し <br>";
//               var_dump($line);               
               fputcsv($fp,  $line);
          }
        fclose($fp);
     }
     echo $file_name."に書き出し終了";
}
?>


ここで、もし記録を保持する配列が下記のようなものであれば、

No 格納データ データ例
0 user id 123456789
1 screen_name hogehoge
2 user name ほげほげ
3 依頼事項 コーヒー
4 依頼回数 3

例えば、下のようなCSVファイルが出来たりする感じ

123456789,hogehoge,ほげほげ,コーヒー,3
987654321,pokori,ポコポコ,番茶,1

ユーザー毎に最新の依頼に書き換えて行くなら
例えば、こんな感じでしょうか?*2

<?php
function update_kiroku_array(&$buf_kiroku, $buf_reply){
  //ユーザー毎の情報が既に配列にあるかチェック
  $exist_r=-1; //該当idが存在した位置を戻す 開始時は -1セット
  $i=0;
  $cnt_kiroku_arr=count($buf_kiroku);   
  foreach($buf_kiroku as $buf_kiroku_rec){
       if($buf_reply["id"]==$buf_pre_rec[0]){ 
            $exist_r=$i;
            break;
        }
        $i++;
  }

  echo "存在チェック結果=".$exist_r;
  
  if($exist_r==-1){//既存の記録無し
      //新しいデータ追加
      echo "既存データがなかったので追加<br>";
       $buf_kiroku[]=array($buf_reply["id"],
                        $buf_reply["screen_name"],
                        $buf_reply["name"],
                        $buf_reply["irai"], 
                        1);  
       $exist_r=$cnt_kiroku_arr;
  }else{//既存データの更新
   //依頼内容は最新情報で上書き、 以来回数をカウントアップ(+1する)
      echo "既存データがあったので更新<br>";
      $buf_kiroku[$exist_r]=array($buf_reply["id"],
                        $buf_reply["screen_name"],
                        $buf_reply["name"],
                        $buf_reply["irai"], 
                        $buf_kiroku[$exist_r][4]+ 1);
  }

  return($exist_r); //更新された位置を戻す
}
?>

*1:PHPって随分便利な関数があるのですね!びっくりしました

*2:PHPに詳しくないので、もっと配列の扱いで良い方法があるかもしれませんが取り敢えず