プロが教えるわが家の防犯対策術!

配列について勉強をしています。
データを差し替えるプログラムを考えていて色々試してみたのですが
下記のような感じでうまく機能しません。

・指定した箇所に追加書き込みになってしまう。
・指定箇所が削除され別の箇所に追加書き込みになってしう。
・まったく機能しなくなったりと困っています。

こんな感じのイメージ結果にしたいのですが・・・

--------------------------------------
dat.csvの中みが下記とします。

サンプル01
サンプル02
サンプル03
サンプル04

↓↓↓↓↓実行結果↓↓↓↓↓

サンプル01
サンプル02
サンプル05
サンプル04

--------------------------------------

ソース
--------------------------------------
外部からの呼び出しで値が「サンプル03」です。
$edit_data=$_GET["sid"];

$test = "サンプル05";

if($_POST["regist"]){
$Data=file("data.csv");

for($i=0; $i<sizeof($Data);$i++){
$line=explode(",",$Data[$i]);

if($edit_data==$line[1]){
array_splice($Data,$i,1,$test);

$fp=fopen("data.csv","w");
flock($fp, LOCK_EX);
foreach($Data as $item)fputs($fp,$item);
fclose($fp);

}
}
}
--------------------------------------


まず、外部から「サンプル03」という値を呼び出し
$edit_data==$line[1]でCSVデータと照合させました。

一致したらその箇所を「array_splice」で置換えるようにしているはずなんですが・・・

なんともうまく機能しません。。。。


どなたか、知恵を貸していただければと思い投稿させて頂きました。

宜しくお願い致します。

A 回答 (1件)

ポイント1


 $line=explode(",",$Data[$i]);
で展開された配列は[0]から始まります。
なのでデータの照合はこうなると思います。
 $edit_data==$line[0]

ポイント2
サンプルのCSVは列が1つのようなので気づいたのですが、
例えば「サンプル01」は「サンプル01(改行)」がデータになっています。
なので「サンプル03」と「サンプル03(改行)」が等しくないため、
データの照合がうまくできませんでした。
読み込んだデータを
 $Data[$i]=rtrim($Data[$i]);
などとして、改行をなくしておき、出力時には、
 fputs($fp,$item."\n");
などとして、改行を入れてみました。

ポイント3
出力処理はループの外でよろしいかと思います。

と言うわけで参考までに私が変更したソースを載せます。
が、もっといい方法、正しい方法があるのかも知れません。

$edit_data="サンプル03";//テストのために設定
$test = "サンプル05";
$Data=file("data.csv");
for($i=0; $i<sizeof($Data);$i++){
$Data[$i]=rtrim($Data[$i]);//改行をなくす処理を追加
$line=explode(",",$Data[$i]);
if($edit_data==$line[0]){//[1]を[0]に変更
array_splice($Data,$i,1,$test);
}
}
//出力処理をループの外へ
$fp=fopen("data.csv","w");
flock($fp, LOCK_EX);
foreach($Data as $item) fputs($fp,$item."\n");//改行をつける
fclose($fp);
    • good
    • 0
この回答へのお礼

ありがとうございます。
アドバイスを頂いたポイントを元に組みなおしました。

意外とすんなりと修正できました。

この度は誠にありがとう御座いました。

お礼日時:2008/09/03 11:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!