• ベストアンサー

php4で同じ要素の数を数えてファイルに保存したいのですが、

php4で同じ要素の数を数えてファイルに保存したいのですが、 Aファイル 80,りんご, 46,みかん, 55,なし, 79,みかん, 444,りんご, 88,みかん, (上記の場合、りんご2、みかん3、なし1) Aファイルの内容をループしつつ、重複数を数えて Bファイルに以下のような形で保存させたいのですが (Bファイルは毎回、新規に書き直し) Bファイル (順番(1~の連番),重複数,名称) 1,2,りんご, 2,3,みかん, 3,1,なし, この場合、どのような記述をすれば良いのでしょうか。 お手数をおかけしますがご教授いただけますと幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kuzumiHK
  • ベストアンサー率72% (132/183)
回答No.2

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

bou1025
質問者

お礼

ご回答ありがとうございますm(__)m おかげさまで思ったとおりの処理ができるようになりました。 fgetcsvの処理や連結の方法もとても参考になりました。 また、部分部分で説明やテスト表示まで考慮いただきとてもわかりやすかったです。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

別の観点から。 今は必要ないかもしれませんが、将来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クエリの結果をさらに加工したり、 他関数に渡したりすることがあるなら後者のほうが便利でしょう。

bou1025
質問者

お礼

データベースの事をご教授いただきありがとうございます。 まだまだ未熟でデータベースを全然活用できるレベルではないのですが 是非とも勉強していきたい部分です。 いただいたアドバイスを元にして勉強したいと思います。 ありがとうございました。m(__)m

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

<? $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); ?>

bou1025
質問者

お礼

ご回答ありがとうございます。 私のやり方が悪いのだと思いますが $data[1]の部分を$data[3]などにした場合、 上手く表示されませんでした。 またいただいたコードを元に理解を深めたいと思います。 未熟で申し訳ありませんm(__)m

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel:データの構成要素を取り出すには

    質問タイトルをなんと書いてよいのかわからなかったのですが、 下記のようなことをしたいのですが、関数でできますでしょうか? 関数ではなくても他に方法があれば教えてください セルに りんご りんご みかん とまと りんご みかん と入っていた場合に、別のセルに「りんご、みかん、とまと」という風に要素だけ取り出したいのです。 フィルタオプションの「重複レコードを無視する」は利用せずにできますでしょうか?

  • 該当する項目以外の数の総計をだしたい時

    次のようなデータで果物の名前がA1に、果物の数がB1に入力されたときに りんごとみかん以外の果物の数だけをC1のセルに出したい場合は どのような関数を前もって組んでおくのが一番適切なのでしょうか?   A1    B1   りんご  2   みかん  1   ぶどう  1   いちご  2   なし   3 ご回答宜しくお願い致します。

  • 連想配列の要素を削除したい!

    マニュアルを見ているのですが、沢山ある関数の中に、連想配列の要素を削除する関数が見当たりません。 $flutes{'a'} = "りんご"; $flutes{'b'} = "みかん"; このうち、bのみかんだけを削除したいのですが…。

    • ベストアンサー
    • PHP
  • エクセルで別の行に並んだ重複データをチェックしたい

    ネットで色々調べてはみたのですがやり方がいまいち見つからずどなたかお力添えいただけると幸いです 同じ行にならんでいるデータ内で重複するものを見つける関数はわかったのですが 別の行に並んでいるそれぞれのデータで重複するものを見つけるやり方はありますか? 例)      A    B 1  みかん  りんご 2  みかん  ぶどう 3  りんご   もも 上記の場合、A3のりんごとB1のりんごが重複していますがこれを探したいのです ※A1のみかんとA2のみかんは含みません 不慣れな質問で大変恐縮ですが何卒よろしくお願いいたします

  • Excel 2つの重複データに重複先セル番地を表示させたい!

    お世話になります。 エクセルで2つの重複しているデータがランダムにがあります。 下記のように表示いたいのですが、良いほうを教えて下さい。 たとえばA1のみかんがA7と重複している時【7】と表示したい ※VBAはわかりません。関数は得意です。  よろしくお願いします。 A  B C 1  7 みかん 2  5 りんご 3    もも 4  6 なし 5  2  りんご 6  4  なし 7  1  みかん 8  9  ぶどう 9  8  ぶどう

  • 集合のユニークな要素数の数式表現について

    集合のユニークな要素数(重複する要素を除いた後の要素の数)を数式表現したいのですが、 どのように表現すれば良いのかわかりません。 例えば、集合A={1, 2, 1, 2, 3}の場合だと、 1,2,3の”計3個”を数式で表現(定義)したいです。 もちろん、単純な要素数なら、|A|といった形式で表現できますし、 集合の中での唯一の要素の数(上の例だと「3」の1個)であれば、 条件式とセットで容易に表現できると思うのですが、 ユニークな要素の数となると、うまく表現できずに困っています。 どなたかお知恵を拝借できないでしょうか。 よろしくお願いします。

  • エクセルの重複データ、必要数を指定して絞る

    エクセルの重複データ、必要数を指定して絞ることは可能ですか。 エクセル2010です。 マクロはよくわからないので、マクロを組まねばならないようでしたらあきらめます。 たとえばある列に (別の列もデータがあります。 この列を基点にしぼるイメージです) りんご りんご りんご りんご りんご りんご りんご りんご バナナ バナナ バナナ バナナ バナナ バナナ みかん みかん みかん みかん みかん みかん みかん みかん みかん みかん と、個数がランダムで同データがあるような場合に りんご りんご りんご りんご りんご バナナ バナナ バナナ バナナ バナナ みかん みかん みかん みかん みかん と5個に絞るということです。 「重複するレコードは無視する」としたときに1つにしぼられますが、 1つでなく、5つに絞るようなイメージです。 そのような指定がなんらかで可能でしょうか。 テキストフィルターをうまく使えばできたりするでしょうか。 よろしくお願い致します。

  • EXCELで重複する値の検索

    EXCELで重複する値を検索して、かつその重複した値と同じ行の隣のセルの値を返すということをしたいのですが、どうすればうまくいきますでしょうか。 具体的には下記のようになります。    A    B   C 1 りんご  A市場 2 みかん  C市場 3 りんご  D市場 4 なし   B市場 5 バナナ  A市場 6 りんご  F市場 上のような表があったとして、A列の重複を検索(この場合はりんごが重複)して、重複した場合はB列の値をC列に返すことをしたいんです。 希望する出力は以下のような形です。    A    B    C  1 りんご  A市場  D市場、F市場 2 みかん  C市場 3 りんご  D市場  A市場、F市場 4 なし   B市場 5 バナナ  A市場 6 りんご  F市場  A市場、D市場 よろしくお願いします。

  • エクセル・別のファイルを参照

    ファイル名 りんご みかん と、2個あったとします。 それぞれ、同じ形式で数字が同じセルに入っています もう一つももという名前のファイルをつくり もものB1に、 りんごのB1を表示させたいときは、 もものB1にカーソルを置いて、=を押して りんごのB1をクリックすれば、式が入りますよね。 それは、できるのですが、 このりんごをみかんに変更するときは、どうしたらいいのでしょうか? もものA1に りんごやみかんといったファイル名を表示させることによって もものB1には、自動的に、A1で選択したファイルの中のB1が表示されるような設定にしたいのです。 わかる方いらっしゃいましたら、教えてください。よろしくおねがいします。

  • 数を数える(ピポットテーブル?)

    A   B りんご 4/1 みかん 4/2 みかん 4/2 りんご 4/3 ぶどう 4/3 これをピポットテーブルで     4/1 4/2 4/3 りんご 1     1 みかん    2 ぶどう       1 こんな風に出すにはどうすればいいですか?

このQ&Aのポイント
  • 女性の通勤に最適なクロスバイクの選び方と乗り方について解説します。
  • クロスバイクの重さにストレスを感じている女性のため、改善策を紹介します。
  • クロスバイクのメンテナンスについても具体的な方法をご紹介します。
回答を見る