- 締切済み
PHPのアドバイスをお願いします
したいことや、ソースをzip圧縮かけてアップしますので、アドバイスをして頂けませんでしょうか? よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- shimix
- ベストアンサー率54% (865/1590)
#そのまんまの回答は気が引けるので(汗 キー項目と値の2項目がカンマで区切られているCSVファイルに同一キーがあれば加算、なければ作成という処理は下記のように書けます。キー項目が複数になればその全部が一致しているかチェックするだけなのでそのくらいは大丈夫ですよね(さすがにこれがわからないと困るので)。 <?php // デバッグデータ投入 addCSV('test.csv', 'aaa', 10); addCSV('test.csv', 'bbb', 20); addCSV('test.csv', 'ccc', 30); addCSV('test.csv', 'aaa', 100); addCSV('test.csv', 'bbb', 200); addCSV('test.csv', 'ddd', 40); print 'Done'; function addCSV($filename, $key, $value) { $fp = fopen($filename, 'r+'); $fw = tmpfile(); $exists = false; while (list($fkey, $fval) = fgetcsv($fp)) { if (!$exists) { if ($key == $fkey) { $fval = $fval + $value; $exists = true; } } fputcsv($fw, array($fkey, $fval)); } rewind($fw); rewind($fp); while ($line = fgets($fw)) { fwrite($fp, $line); } if (!$exists) { fputcsv($fp, array($key, $value)); } fclose($fp); fclose($fw); } ファイルロックは省いています。適宜排他処理を入れてください。
- shimix
- ベストアンサー率54% (865/1590)
ANo.3です >カートはこのひとつのファイルで作るようにと指示がありまして。 ひょっとして課題か何かですか?だとしたら自分で考えないと何の意味もないと思いますが・・・
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 とりあえず既存のソースのまま修正するとした場合は以下のようになると思います。 $fp = fopen("cart.csv", "w"); foreach($cartread as $val){ if($custmer[$id][0]==$val[0]){ if($val[1]==$pno){ $val[2]=$val[2]+$kazu; } fputs ( $fp, $val[0].",".$val[1].",".$val[2] . "\n"); } } fclose($fp); 試していないのでバグってたらすみません。 最初のソースだとif($val[1]==$pno)が一致しないとfputsが実行されませんのでその行のみのファイルになってしまいます。
- shimix
- ベストアンサー率54% (865/1590)
テキストファイルは、所定の行だけ書き替えるということが出来ません。全部を読んで書き出す(そのときに所定の行だけ違う内容で書き出す)という方法を採るしかありません。追加は簡単ですが書き替えは面倒ですので、それを考慮して設計してください。 一般的にはtmpfileを使って、tmpfileにコピーしながら同一キーの有無をチェックして ・同一キーあり:その行の値を書き替えてコピー、残りも全部コピーしてから元ファイルに書き戻す ・同一キーなし:tmpfileは無視して、元ファイルに追記 といった手順になります。 ∴ 本来はデータベースを使うべきです。 なお(今回の案件ではCSVファイル自体をお勧めしませんが)CSVファイルを扱うのに読み書き+explode/implodeするくらいであれば(implodeは使っていなかったかな)、素直にfgetcsv/fputcsvを使ってください。RFCに則ってCSVファイルを扱うのは案外に手間です(単純なexplodeではダメです)。
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 このやり取りの方法じゃ、Q&Aサイトの意義に反するのでこちらでアドバイスします。 まず追加してもうまくいかない部分については、配列に読み込んだcsvを全てもう一度書けば良いと思います。 その中で同じ商品IDがあった場合は数量を加算してあげれば良いのでは? そうすれば、追加された時の商品IDの数量のみ更新されたファイルになると思います。 他にアドバイスとしては、 全てのユーザのカート内容を同じCSVに持つのは無理があると思います。 開発段階であるからか同時アクセス時の排他制御もいまのところ実装されていないようですし、いちいち一人一人のカート内容が変わっただけで、CSVファイルを総なめするのは効率が悪いと思います。 例えばユーザごとにカート用のファイルを作成してあげるとか、データベースを利用するとか
お礼
わかりました。こちらでお願いします。 >>追加してもうまくいかない部分については、配列に読み込んだcsvを全てもう一度書けば良いと思います。 それはカートのforeachの $val[0].",".$val[1].",".$val[2]とは違う部分でしょうか? カートについてなのですが、私も同感でしてユーザー毎にCSVを作ったほうがいいと思うのですが、カートはこのひとつのファイルで作るようにと指示がありまして。すみません。
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 質問はいったいなんなんでしょうか?
お礼
ご返事ありがとうございます。 こちらにアップしました。 http://urx.nu/1F8o できればお手数ですが、http://snipt.org/のようなソース共有に張り付けて頂けると嬉しいです。よろしくお願いします
お礼
書き換えがとても面倒でして。。。 tmpfileというのがあるのですか。初めて知りました。 コピーをするのですか?どういった使い方でしょうか fgetcsvでプログラムもしたことがありませんでした。なるほど。貴重なアドバイスありがとうございます。