- ベストアンサー
二次元配列の削除
下記のような二次元配列になったファイル名"abc"があります 1,ab,4500,あ, 2,sd,1000,え, 3,df,500,お, 4,ef,200,い, リストの4番目のひらがな部分を削除したいのですが よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ファイルポインタ2つ使えば全部読まなくてよくなるかも (前から3つだけ有効にした場合) <?php $filex = "userdata"; $nfile = "new_userdata"; $fp1 = fopen( $filex, "r" ); $fp2 = fopen( $nfile, "w+" ); flock ( $fp2, LOCK_EX ); $flg=true; while (($data = fgetcsv($fp1, 1024, ",")) !== FALSE) { fputs($fp2,($flg?"":"\n").implode(array_slice($data,0,3),",")); $flg=false; } flock ( $fp2, LOCK_UN ); fclose ( $fp1 ); fclose ( $fp2 ); ?>
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
>ファイルを書き換えたいのですが それはfopenを読込属性の'r'で開いてもむり・・・ 'r+'で開いて、読んで、シークして、fwriteで書き込む。 また4番目の項目を削除する作業をあやまって2回以上おこなうと 5番目、6番目・・・とどんどん削除されちゃうので、 仕様をもうすこし詰めてからトライすることをおすすめします。
補足
何度も回答ありがとうございます、 ファイル全体を読み込んで配列に入れ 一行づつ読み込んで新しい配列を作り 新しいファイルを追記モードで開き 一行づつ書き込むことにしました、 下記のコードでおかしなところがあれば指摘お願いします。 <?php $filex = "userdata"; $nfile = "new_userdata"; $file = fopen ( $filex, "r" ); while ( $arry = fgetcsv( $file, 1000, "," )){ $dcsv[] = $arry; } fclose ( $file ); foreach ( $dcsv as $line ) { list ($fmain_no,$fname,$fpasswd,$fmail) = $line; $array = compact ( "fmain_no", "fname", "fpasswd" ); $string = implode ( ",", $array); $file = fopen( $nfile, "a" ) or die ( "$nfile エラー" ); flock ( $file, LOCK_EX ); fputs ( $file, $string."\n" ); flock ( $file, LOCK_UN ); fclose ( $file ); } ?>
- yambejp
- ベストアンサー率51% (3827/7415)
listで受けるフローであれば、削除しなくても変数を指定しなければ すむのでは・・・と思いつつ foreachで回して要素をunsetするのでどうですか? <? $filex = "userdata"; $file = fopen ( $filex, "r" ); while ( $arry = fgetcsv( $file, 1000, "," )){ $dcsv[] = $arry; } fclose ( $file ); foreach ( $dcsv as $key=>$line ) { unset($dcsv[$key][3]); } print_r($dcsv); ?>
補足
<?php $filex = "userdata"; $file = fopen ( $filex, "r" ); while ( $arry = fgetcsv( $file, 1000, "," )){ $dcsv[] = $arry; } fclose ( $file ); foreach ( $dcsv as $key=>$line ) { unset($dcsv[$key][3]); } print_r($dcsv); //#################################################### ?> どこが間違っているのか上記のコードでは出来ません ファイルを書き換えたいのですが
- yambejp
- ベストアンサー率51% (3827/7415)
>二次元配列になったファイル名 まったく意味がわかりません。 二次元でも配列でもファイル名でもないように見えますが、 もうすこし具体的に状況を説明してもらわないとなんとも・・・
補足
ファイル名"userdata" $filex = "./cgi-bin/data/userdata"; ########################################### $file = fopen ( $filex, "r" ) or die ( "エラー $filex" ); while ( $arry = fgetcsv( $file, 1000, "," )) { $dcsv[] = $arry; } fclose ( $file ); foreach ( $dcsv as $line ) { list($no,$fname,$fta,$fhi) = $line;} $fhi を削除したい。
お礼
回答ありがとうございました、 新しいファイルが考えていた通りできました、 while (($data = fgetcsv($fp1, 1024, ",")) !== FALSE) { fputs($fp2,($flg?"":"\n").implode(array_slice($data,0,3),",")); $flg=false; } この部分は今のところ私の頭では分かりませんが これからコードを解読して自分のものにしたいと思います