- ベストアンサー
php4で同じ要素の数を数えてファイルに保存したいのですが、
php4で同じ要素の数を数えてファイルに保存したいのですが、 Aファイル 80,りんご, 46,みかん, 55,なし, 79,みかん, 444,りんご, 88,みかん, (上記の場合、りんご2、みかん3、なし1) Aファイルの内容をループしつつ、重複数を数えて Bファイルに以下のような形で保存させたいのですが (Bファイルは毎回、新規に書き直し) Bファイル (順番(1~の連番),重複数,名称) 1,2,りんご, 2,3,みかん, 3,1,なし, この場合、どのような記述をすれば良いのでしょうか。 お手数をおかけしますがご教授いただけますと幸いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
array_count_valuesという重複数の配列を自動で生成できる便利な関数があるようです。 <?php $moto = fopen("moto.csv", "r"); $array = array(); $i=0; while (($data = fgetcsv($moto, 1000, ",")) !== FALSE) { $array[$i] = $data[1]; // csvファイルの中身を配列に $i++; } $all = ""; $i=1; foreach(array_count_values($array) as $key => $value){ $all = $all . $i . "," . $value . "," . $key . "\n"; // 配列をカンマ区切りで連結していく $i++; } // print $all; // 新しく書き込む内容を確認 $kekka = fopen("kekka.csv", 'w'); fwrite($kekka,$all); fclose($kekka); fclose($moto); print <<< DOC_END <ol> <li><a href="kekka.csv" target="_blank">kekka.csv</a></li> </ol> DOC_END; print_r(array_count_values($array)); // 配列の内容を確認 ?> ▼csvファイルを配列に格納するphp関数 “fgetcsv” http://blog.dacelo.info/php/entry-636.html ▼[php]配列内の値の重複チェックを行う時に使える関数array_count_values http://dbinfo.sakura.ne.jp/?contents_id=114
その他の回答 (2)
- honoka-cha
- ベストアンサー率54% (40/73)
別の観点から。 今は必要ないかもしれませんが、将来Aファイルをデータベースのテーブルに格納す るようになったら、次のような方法がすっきりした処理になるでしょう。 重複数と名前を表示するために次のようなSQLクエリをPHP側から実行 SELECT count(*) nnn, name FROM table group by name 結果は次のようになります。 nnn name --- ----- 2 りんご 3 みかん 1 なし ここで同時に連番を付けることも出来ますが、もしDBとしてmySqlを使うなら少し複雑に なるので、連番はPHP側の処理、例えばwhile文を回す中で付けていった方が楽です。 1行づつwhile文を回す中で連番を付けながらBファイルへの書き込みを行えば完了です。 また、while文でいったん配列に格納しておき、while文を抜けてからあらためて Bファイルへ書き込んでも良いでしょう。PHPでSQLクエリの結果をさらに加工したり、 他関数に渡したりすることがあるなら後者のほうが便利でしょう。
お礼
データベースの事をご教授いただきありがとうございます。 まだまだ未熟でデータベースを全然活用できるレベルではないのですが 是非とも勉強していきたい部分です。 いただいたアドバイスを元にして勉強したいと思います。 ありがとうございました。m(__)m
- yambejp
- ベストアンサー率51% (3827/7415)
<? $fname="a.txt"; $fp = fopen($fname, "r"); $array_b=Array(); while (($data = fgetcsv($fp, 1000, ",")) !== FALSE) { if(!isset($array_b[$data[1]])) $array_b[$data[1]]["num"]=count($array_b)+1; $array_b[$data[1]]["count"]++; } fclose($fp); $fname="b.txt"; $fp = fopen($fname, "w"); foreach($array_b as $key=>$data){ fwrite($fp,$data["num"].",".$data["count"].",".$key.",\n"); } fclose($fp); print_r($array_b); ?>
お礼
ご回答ありがとうございます。 私のやり方が悪いのだと思いますが $data[1]の部分を$data[3]などにした場合、 上手く表示されませんでした。 またいただいたコードを元に理解を深めたいと思います。 未熟で申し訳ありませんm(__)m
お礼
ご回答ありがとうございますm(__)m おかげさまで思ったとおりの処理ができるようになりました。 fgetcsvの処理や連結の方法もとても参考になりました。 また、部分部分で説明やテスト表示まで考慮いただきとてもわかりやすかったです。 ありがとうございました。