• 締切済み

重複データを削除して上書きする

data.datファイルには hoge@hoge.com, hoge1@hoge.com, hoge2@hoge.com, hoge3@hoge.com, hoge4@hoge.com, hoge5@hoge.com, hoge6@hoge.com, hoge7@hoge.com, hoge8@hoge.com, hoge9@hoge.com, hoge@hoge.com, hoge1@hoge.com, hoge2@hoge.com, hoge3@hoge.com, hoge10@hoge.com PHPファイルは↓です。 <?php //ファイルの内容を配列に格納 $lines = file( 'data.dat' ); //重複ファイル削除 $array = array_unique($lines); //配列の全要素に対して処理を行う foreach( $array as $line ){ print "$line<br>\n"; } ?> 重複したファイルを削除して表示することはできましたが、新しいデータをdata.datファイルに書き込む場合はどうしたらよいでしょうか? 重複ファイルだけdata.datファイルから削除して、削除された行を詰めて上書きしたほうがよいのでしょうか? 他に、いい方法があればアドバイス下さい。

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

回答No.1

全書き換えで、問題ないと思います。 $fp = fopen('data.dat', 'w'); //ロック処理 flock($fp,LOCK_EX); foreach($array as $v){ fputs($fp,$v); } //ロック処理終わり flock($fp,LOCK_UN); これで、いけると思いますが、どうでしょう? fclose($fp);

midorin_h
質問者

お礼

できました。ありがとうございます。 もう少し勉強します。

関連するQ&A

  • 重複データの削除方法

    data.datのログ形式 先頭、最後は半角カンマ  fgetcsv でdata.datを1行単位で読み込み ,a.hoge@hoge.com, ,ba.hoge@hoge.com, ,c.hoge@hoge.com, ,a.hoge@hoge.com, ,b.hoge@hoge.com, ,c.hoge@hoge.com, 重複した行の1行を削除して詰めてdata.datを上書きする方法の簡単な方法をお願いします。 参考になるようなサンプルコードを書いていただけるとありがたいですが、自力で勉強もしたいので、ヒントや参考サイトがあれば教えて下さい。

    • 締切済み
    • PHP
  • getパラメータでメルアド削除

    URLパラメータでたとえば http://www.hoge.hoge.delphp?del_mail=hoge01@hoge.hoge と送信したときにログファイルから削除し再書き込みしたいのですが、うまくいきません。 *ログファイルには重複したファイルもありますので重複ファイルも同時に削除できればいいのですが・・・ 下記コードに対するアドバイス下さい。 mail.log------------- hoge01@hoge.hoge hoge02@hoge.hoge hoge03@hoge.hoge hoge04@hoge.hoge hoge01@hoge.hoge hoge02@hoge.hoge 上記のようなメールアドレスだけのログがあります。 del.php------------------------------------- $array_file = file("./list.db"); $name = htmlspecialchars($_GET['del_mail'], ENT_QUOTES); unset($array_file[$name]); foreach ($array_file as $line) { $file_new .= $line; } file_put_contents("./list.db" , $file_new , LOCK_EX );

    • 締切済み
    • PHP
  • phpでcsvデータをランダム表示について

    下記はcsvデータをランダムに1つだけ抽出するphpのプログラムですが、1度表示したデータに色をつけるとか、表示させない方法はありますか? <!doctype html> <html> <head> <meta charset="UTF-8"> <title>無題ドキュメント</title> </head> <body> <?php // 抽出数 $count = 1; $list = array(); // 読み込みCSVファイル $lines = file('test.csv'); shuffle($lines); foreach ($lines as $line) { if ( ! in_array($line, $list)) { array_push($list, $line); if (count($list) >= $count) { break; } } } // CSVファイルに出力 $file = fopen('test2.csv', 'w'); foreach ($list as $l) { echo $l.'<br>'; if ($file) { fputs($file, $l); } } fclose($file); ?> </body> </html>

    • ベストアンサー
    • PHP
  • 多次元配列の重複削除

    PHPの多次元配列の重複削除で悩んでいます・・・。 例) array(4) { [0]=> array(2) { ["name"]=>string(10) "春" ["cool"]=>int(0) } [1]=> array(2) { ["name"]=>string(14) "冬" ["cool"]=>int(200) } [2]=> array(2) { ["name"]=>string(14) "冬" ["cool"]=>int(0) } [3]=> array(2) { ["name"]=>string(14) "冬" ["cool"]=>int(200) } } 上記のような配列があった場合 下記のように重複してるものを削除させたいのです・・・。 array(4) { [0]=> array(2) { ["name"]=>string(10) "春" ["cool"]=>int(0) } [1]=> array(2) { ["name"]=>string(14) "冬" ["cool"]=>int(200) } [2]=> array(2) { ["name"]=>string(14) "冬" ["cool"]=>int(0) } } array_unique($array)を使用してもうまく行かず 悩んでおります。。。。 よい方法等あればご教授お願いいたします。

    • ベストアンサー
    • PHP
  • PHPについて質問です。

    PHPについて質問です。 <?php $lines0 = file('data.txt'); $lines = array_reverse($lines0); foreach ($lines as $line_num => $line) { echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n"; } ?> でファイルの内容は表示することができるようになったのですが、 次に、$linesをテキストエリアに表示させようとすると、Arrayと表示されます。 <textarea name="textarea" cols="50" rows="5" disabled="disabled">$lines</textarea> どうすれば解決できるでしょうか?

    • ベストアンサー
    • PHP
  • simplexmlで取得したデータを配列へ。

    PHP5のsimplexml_load_fileでデータにアクセスし、配列に 入れたいのですが、うまくいきません。 $xml = simplexml_load_file($file); $arrayA = array(); foreach($xml->A as $A){ array_push($arrayA, $A); } print_r($arrayA); とすると、 Array ( [0] => SimpleXMLElement Object ( [0] => data1 ) [1] => SimpleXMLElement Object ( [0] => data2 ) [2] => SimpleXMLElement Object ( [0] => data3 ) ) となってしまいます。 そうではなくて、 Array ( [0] => data1 [1] => data2 [2] => data3 ) とデータの中身を直接配列に入れたいのですが、 どうすればよいのでしょうか。 非常に初歩的な質問じゃないかと思うのですが、どなたがご教示 いただけますと有難いです。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 削除フラグ

    こんにちわ。今まで、同じような質問をしてきたものです。 PHPの掲示板で削除機能を作成しようとしています。 投稿番号や削除キーがあっていれば、削除をするという 削除フラグまではを作成したのですが、実際の削除(論理削除)がうまく行かず、苦悩しております。下のarray_splice()の配列から特定の行を削除・置換する関数を使用し削除をしようとしているのですがこれでは論理削除などはできないでしょうか?関数ではできないのでしょうか?また、if( $temp[5] !=0 )とすることで、物理削除ではなく表示を させないということで、論理削除としようと考えました。 掲載した記述部分は、削除ボタンが押されたら削除処理をする 部分です。また、実際の書き込み部分も記述させていただきます。 <?php $NO = $_POST["NO"]; $hoge = $_POST["hoge"]; $delkey = $_POST["delkey"]; # 削除ボタンが押されたら if($submit =="削除"){ $data = file("data.txt"); foreach( $data as $value){ $temp = explode("\t",$value); if($temp[4] == $NO && $temp[6] ==$delkey ){ //削除フラグを0以外にする処理 if( $temp[5] !=0 ){ array_splice($data, $temp[4], 1); } } } } ?> 書き込み部分は下のようにしています。 $file = fopen("data.txt", "w"); fwrite($file, "$name\t$mail\t$body\t$dt\t$count\t$flag\t$delkey\n".implode("", $data)); fclose($file);

    • ベストアンサー
    • PHP
  • テキストデータから指定行の削除

    phpでサイトを作っています。 テキストデータを一行ずつ表示させ、指定した行を削除したいのですが、どうすればいいのでしょうか? -- data.txt -- aaa,data1, bbb,data1, ccc,data1, ddd,data1, -- php -- <?php $del=$_POST['del_no']; if($del!=""){ $data_all = file("data.txt"); for($i=0;$i<count($data_all);$i++){ $data_array = explode(",",$data_all[$i]); if($data_array[0]!=$del){//削除データ以外を再書き込み $txt="$data_array[0],$data_array[1],\n"; $fp = fopen("data.txt", "w"); flock($fp,1); foreach ($txt as $line) {// 1行ずつファイルへ書き込み? fwrite($fp, $line); } fclose($fp); break; } } } ?> <b>data list</b> <? $data_all = file("data.txt"); for($i=0;$i<count($data_all);$i++){ $data_array = explode(",",$data_all[$i]); echo "$data_array [0]<br />"; echo "<form method=\"post\">"; <input type=\"hidden\"name=\"del_no\" value=\"$data_array[0]\" />";//削除するデータをPOST echo "<input type=\"submit\" value=\"削除\" />"; echo "</form>"; } ?> こうすると、テキストデータが白紙になってしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpでのログファイル要素の取り出しについて

    お世話になります。 phpで以下の事をする場合についてなのですが、 log.dat(ログファイル) (log.datの内容) 643,1232,abceee,やま, 543,896,ddc.jp,かわ, 343,2435,rrsc,国, 214,1130,edbv.com,鳥, ※ログの順番はソートによって変わるようになっています 上記ログファイルの指定した部分だけを取り出して表示させたい場合、 例えば以下のようにforeachなどのループで毎回、 照合させて取り出すしか方法はないでしょうか。 hoge.php ============================ $id = $_GET['id']; $lines = file("log.dat"); foreach ($lines as $line) { $data=split("," ,$line); if'($data[2] == $id) { print "$data[1]"; break;} } ===================================== これを、たとえばですが、 以下のような記述で任意の箇所に何箇所か表示させる事ができるようにしたいのですが <?require("./hoge.php?id=rrsc");?> そのたびにlog.datをループさせてifで照合させて・・・ とやりますとログファイルもそこそこ大きくなってきますと 何回もループさせる事からサーバー負荷の点が気になってしまいまして このような場合、他に効率の良い方法などございましたら ご教授いただけないでしょうか。 (データベース等の使用は出来ず、あくまでログファイルを使って行わなければなりません) お手数をおかけしますがもしご存知の方がいらっしゃいましたら ご教授いただけますと幸いです。 (PHP Version 4.3.9 で稼動することが前提となります)

    • ベストアンサー
    • PHP
  • print_rで出力した配列データファイルをfile_get_cont

    print_rで出力した配列データファイルをfile_get_contentsでそのまま取り込もうとしましたが、配列としてではなく文字列として取り込んでしまいます。 ひとつの配列にまとまってしまします。 text.php $data=array(1,2,3,4,5); print_r($data); Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) output.php これを別ファイルで取り込むと$value= file_get_contents("text.php"); echo $value; print_r($value);両方とも Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) が出力されました。 配列として取り込みたいのですが可能でしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう