• 締切済み

PHPのCSVファイル読み込みについて

現在、PHPでCSVファイルを読み込み、広告をランキングしてランダムで出力しています。 今後例えばCSVファイルの中に10行の広告があるとしたら、5行をランダムで出力したいのですが、方法がわかりません。 現在はCSVファイルの中に5行広告があり、出力している広告も5行です。 ソースはこちらになります。 <? $h = file_get_contents("http://ドメイン/csv/koukoku.csv"); $h = trim($h); $h = explode("\n",$h); shuffle($h); $i = 0; $ii = 1; $star[] = "★★★"; $star[] = "★★★★"; $star[] = "★★★★"; $star[] = "★★★★"; $star[] = "★★★★★"; $star[] = "★★★★★"; $star[] = "★★★★★"; while($ii<6){ $v = explode(",",$h[$i]); if(isset($img)){ foreach($img as $val){ if($val==$v[2]){ ++$i; continue; } } }else{ $img[] = $v[2]; } shuffle($star); print '<p class="jyunni"><mark>第'.$ii.'位</mark>'.$v[1].'</p>'; print '<div class="box clearfix"><p class="s_img"><a href="'.$v[0].'"><img src="'.$v[3].'" /></a><p>'; print '<ul><li>人気度:'.$star[0].'</li><li>人気ポイント:<br /><span class="mini">'.$v[2].'</span></li><li class="btn"><a href="'.$v[0].'" class="btn1">詳細を見る</a></li></ul></div>'; ++$i; ++$ii; } ?> 分かる方教えてください。

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

みんなの回答

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

CSVファイルはデータとして改行コードを保持出来る仕様になっています。全部を読み込んでから改行コードで分割するのは「データ中に改行コードがない」というのが大前提ですが、それでいいんですよね? それでもCSVファイルをカンマでexplodeするのもどうかと思う(データとしてカンマが存在する可能性が案外にある)。 ざっくりと書き直しましたが、仕様が不明な部分は適当な処理になってます。 #$star はいったいどうやろうとしているのか読み取れませんでした。 <?php $arr = file("http://example.com/csv/koukoku.csv", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // CSVがSJISのときは下記を有効にする // mb_convert_variables('utf-8', 'cp932', $arr); shuffle($arr); $star = "★★★★★"; $out = <<<EOD <p class="jyunni"><mark>第%d位</mark>%s</p> <div class="box clearfix"> <p class="s_img"><a href="%s"><img src="%s" /></a><p> <ul> <li>人気度:%s</li> <li>人気ポイント:<br /><span class="mini">%d</span></li> <li class="btn"><a href="%s" class="btn1">詳細を見る</a></li> </ul> </div> EOD; $ct = 0; foreach ($arr as $line) { $ct++; list($url, $title, $point, $img) = str_getcsv($line); printf($out, $ct, h($title), $url, h($img), mb_substr($star,0,rand(3,5)), intval($point ), $url); if ($ct >= 5) { break; } } function h($arg) { return htmlspecialchars($arg, ENT_QUOTES); }

kanashufu
質問者

お礼

ありがとうございます。 CSVデータの中にはカンマで広告先URLや人気ポイントなどを区切ったものが5行あります。 この方法で試してみます。

  • akauntook
  • ベストアンサー率19% (295/1481)
回答No.1

カテゴリーは技術者向のようですが、素人向けの回答で良いですかね? 本来回答すべきでないかもしれませんが、たまたま気が向いたので回答します。 まず、phpの省略タグを使うのは止めた方が良いです。 <?php と書きましょう。 次に、変数名は意味の分かる単語にしましょう。変数が何を表しているのかわかりづらいです。 $imgが定義されてません。 >現在はCSVファイルの中に5行広告があり、>出力している広告も5行です。 CSVファイルにあるのは広告ではありません。CSVファイルにはデータしかありません。ですので、CSVファイルには各行に一つの広告のデータがあり、その五行のデータを読み込み、5つの広告を出力しています。 と言うと、正しい意味になります。 読み込むデータの行が何行であろうと、出力する広告の数は5つだと書いてあります。 CSVファイルに10行の広告データがあっても5つの広告を出力すると思いますけど、まずは試しましょうよ。 あえて言うなら、逆にCSVのデータが5行未満だと $v = explode(",",$h[$i]); でエラーが起き データに不備があると配列$vに存在されない要素があるため、HTML出力部分にエラーかおきます。

kanashufu
質問者

お礼

すみません、素人です。 5行以上を試してます。ありがとうございました。

関連するQ&A

  • CSVファイルの読み込みで日本語が出力されない!

    PHPを使ってCSVファイルを部分的に読み込むコードを教えてもらいました。 しかし、CSVに入力している英語と数字は出力されるのに、日本語は空白のままでした。 教えてもらったコードは次の通りですですが、日本語も出力する場合、どうしたら良いのでしょうか? <?php function h( $str ) { return htmlentities( $str, ENT_QUOTES, 'UTF-8' ); } ?> <? if (($handle = fopen("test.csv", "r")) !== FALSE) : ?> <table class="table1" width="100%" cellspacing="0" cellpadding="0" border="0"> <tr> <? $i = 0; ?> <? while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) : $i ++ ?> <td><?=h($data[0])?><img src="http://1-<?=h($i)?>.gif"><br><?=h($data[1])?><br><?=h($data[2])?><br><span class="red"><?=h($data[3])?>円</span></td> <? endwhile; ?> </tr> </table> <? fclose($handle); ?> <? endif; ?>

    • ベストアンサー
    • PHP
  • PHPでCSVファイルの任意の行だけを編集したい

    簡易掲示板の管理画面を作成しようと思っていますが、 うまくいかずに悩んでいます。 入力フォームで送られてきた内容をcsvファイルに書き込み、 それを表示するという掲示板なのですが、 管理画面ではそのcsvファイルを操作して、 任意の書き込みを修正・削除できるようにしたいと考えています。 以下、PHPコードです。 if($mode == "edit"){ foreach($csv as $val){ list($li_no, $li_date, $li_comment) = split("\t",$val); if($li_no == $info_no){ $csv[$info_no] = "$id\t$date_y/$date_m/$date_d\t$comment\t\n"; fputs($fp,$csv[$info_no]); fclose($fp); } } }else{ $dat = "$id\t$date_y/$date_m/$date_d\t$comment\t\n"; $fp = fopen('$csv' , 'w'); fputs ($fp, $dat); for ($i=0; $i<1000;$i++){ fputs ( $fp,$csv[$i]); } fclose($fp); } 編集用のフォームで$info_noを飛ばして、 CSVファイル内の$li_noと一致した場合、 $li_noの行を書き換えという処理をしているつもりなのですが、 なぜか、他の行がすべて消えて、 編集した行だけがファイル内に残ります。 いろいろと検索して試してはみたのですが、 どうもうまくいきません。 どなたか教えてください。 お願いします。 これ以外の方法で簡単にできる方法があれば そちらも教えていただけたら幸いです。

    • ベストアンサー
    • PHP
  • phpプログラムが思うように動作しません

    php初心者です。 とある製品のオーダーメイドサイトを作っています。 製品リストのcsvを読み込み、行分だけデータを表示させる様なプログラムを組みたいのですが 繰り返し処理が動作しないのでアドバイスをお願いします。 サーバーはhetemlです。 プログラムとcsvを編集しているOSがmacXなので、 csvの改行コードのせいで繰り返しができてないのかもとも思っています。 ソースは以下の通りです。 <? #csvファイルをオープン $file = fopen("itemlist.csv","r"); while(!feof($file)) { //カウンターを設置、初期化 $cnt=0; #fgetcsv関数がfalseを返却するまで実行 $data = fgetcsv($file);// $itemid = $data[$cnt]; $cnt++; $filename = $data[$cnt]; $cnt++; $itemname = $data[$cnt]; $cnt++; $price = $data[$cnt]; $cnt++; $detail = $data[$cnt]; $cnt++; print $data; print "<li>"; print "<p><img src='../store/item//".$filename."'></p>"; print "<p><input type='radio' class='required' name='".$itemname."' value='".$price."'>".$itemname."</p>"; print "<p><span class='form_price'>".$price."</span>円</p>"; print "</li>"; } fclose($file); ?> csvの中身です。(テキストエディタで編集) 一番右は在庫数です。 itemid01,01.jpg,itemname001,"800,000",説明1,1 itemid02,02.jpg,itemname002,"900,000",説明2,0 itemid03,03.jpg,itemname003,"1,000,000",説明3,10 itemid04,04.jpg,itemname004,"1,200,000",説明4,4

    • 締切済み
    • PHP
  • CSVファイルの読み込み

    以下のようなCSVファイルを読み込みたいと思っています。 0.575092,0.030525 0.565324,0.018315 0.555556,0.013431 0.553114,0.013431 0.54823,0.015873 0.538462,0.013431 0.531136,0.006105 0.52381,-0.003663 0.516484,-0.010989 0.501832,-0.015873 0.489622,-0.018315 0.477412,-0.020757 0.46276,-0.020757 ・ ・ ・ 50000*2のデータで、以下のようなプログラムを使用しました。 #include <stdio.h> #include <stdlib.h> #include <string.h> /* 確保するデータ保存領域の大きさ(N行×M列) */ #define N 50000 #define M 2 /* データの区切り文字 */ #define SEP_DATA ',' int csv_read(char filename[], double csv[N][M]) { /* ファイルオープン */ FILE *fp; if( (fp = fopen(filename, "r")) == NULL ) { printf(" file open error!!\n"); return -1; } /* 1行毎に読み出し */ char line[256], *ptr; int i, j, k; i=0; while (fgets(line, 256, fp) != NULL) { printf("*%s", line); ptr = line; j=0; do{ /* line[j]から次のタブ文字までを数値に変換 */ csv[i][j] = atof(ptr); /* 次のタブ文字の位置を探す */ ptr = strchr(ptr, SEP_DATA); /* タブ文字の次の文字を示す */ if (ptr!=NULL) { ptr++; } j++; }while(ptr!=NULL && j<M); i++; } /* ファイルクローズ */ fclose(fp); return 0; } int main(int argv, char *argc[]) { char filename[256]; if( argv > 1){ strcpy(filename, argc[1]); } else { printf("Please Input Filename:"); scanf("%s", filename); } /* データ保存用の領域を確保 */ double (*csvdata)[M]; csvdata = (double(*)[M])malloc(sizeof(csvdata) * N); if ( csvdata == NULL ){ return -1; } int i,j; /* 配列の初期化 */ for( i=0; i<N; i++) { for( j=0; j<M; j++) { csvdata[i][j] = 0.0; } } /* CSVデータの読み込み */ if( csv_read(filename, csvdata) < 0 ) { return -1; } /* 配列の出力 */ for( i=0; i<N; i++) { printf("%lf", csvdata[i][0]); for( j=1; j<M; j++) { printf("\t%lf", csvdata[i][j]); } printf("\n"); } free(csvdata); csvdata = NULL; return 0; } しかし、コンパイルは通るのですが実行時にエラーが出てしまいます。 データの大きさに問題があると思うのですが、原因がわかりません。おかしな所のご指摘を頂きたいです。よろしくお願いします。

  • javascriptでCSVを読み込み表示する方法を探しています。

    javascriptでCSVを読み込み表示する方法を探しています。 <div id="hoge"> <ul class="hogehoge"> <li><a href="1行目の1つ目のデータ">1行目の2つ目のデータ</a></li> <li><a href="2行目の1つ目のデータ">2行目の2つ目のデータ</a></li> ・ ・ ・ </ul> </div> で、ulに囲まれた部分をjavascriptで生成させたいのですが・・・ (ulのところのCSS指定は、idではなく、classにしたいです) よろしくお願いいたします。

  • 容量の大きいCSVファイルの読み込みについて

    容量の大きいCSVファイルの読み込みについて 23メガバイトあるCSVファイルに格納し、datファイルに書き込みを行いたいのですが、実行してみるとセグメンテーション違反が表示され上手くいきません。どなたか具体的に教えてください。 環境はMacOSです。 下にファイルを格納し標準出力するまでのプログラムとCSVファイルの内容を記述します。 //********************************************************************************// #include <stdio.h> #include <string.h> #include <stdlib.h> #define D_LENGTH 10000000000000 struct Data{ double voltage; double pressure; double trigger; }; int main(int argc, char *argv[]) { FILE* fp; // ファイルポインタ用 double ret; int n, i = 0; struct Data *dt; fp = fopen("p37-e1.csv","r"); if (fp == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } dt = (struct Data*)malloc(sizeof(struct Data)*D_LENGTH); while( ( ret = fscanf( fp, "%[^,],%[^,],%[^,],%lf",dt[i].voltage,dt[i].pressure,dt[i].trigger) ) != EOF ){ i++; } printf("\n"); printf("Read File*******************\n"); for (n = 0; n < i; n++) printf("%lf,%lf,%lf\n",dt[n].voltage,dt[n].pressure,dt[n].trigger); free(dt); return(0); } //***************************************************************************// p37-e1.csv //***************************************************************************// 2.329595,0.001373,-4.861982 2.325628,0.001984,-4.744793 2.320745,0.001678,-4.659953 2.319829,0.002289,-4.707866 2.319219,0.002289,-4.699321 2.317082,0.002594,-4.532387 2.312505,0.001984,-4.575723 . . . . //*********************************************//

  • phpでcsvの処理で困ってます。

    abc.csvというcsvデータを2次元配列にして、その中から指定した行(送信されてきた値$linenum = $_POST['num'];)の5番目の値を1つ増やして、またcsvデータに上書きしたいと思い下記のようにしてみたのですが、うまくいきません。どのようにすればいいのでしょうか、具体的に教えていただければ、ありがたいです。よろしくお願いします。 <?php header("Content-Type: text/html; charset=UTF-8"); $linenum = $_POST['num']; $list = fopen("abc.csv", "w"); $h = 0; while ($array = fgetcsv($list, 1000,",")) {   for ($i = 0; $i < count($array); $i++){   $newarray[$h][$i] = $array[$i]; } $h++;  } $cu = $newarray[$linenum][4]; $cu = $cu + 1; $newarray[$linenum][4] = $cu; fputcsv($list, $newarray); fclose($list); ?>

    • ベストアンサー
    • PHP
  • CSVファイルの検索結果表示について

    CSVファイルを検索して検索結果を表示したいのですが、 検索結果を表示できません。 トップページ <form action="search.php" method="get"><input type="text" name="key" size="90"> <input type="submit" name="submit" value="検索"></form> 検索結果を表示するページ <?php $ArrKeywordLength = sizeof($ArrKeyword); $fp = fopen('data.csv', "r"); $Result=array(); while(!feof($fp)){ $ret = fgets($fp, 4096); $lines = strip_tags($ret); $Match=true; for($n=0; $n<$ArrKeywordLength;$n++){ if(!strpos($ArrKeyword[$n], $lines)){ $Match = false; break; } } if($Match === true){ $Result[] = $ret; } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <ul> <?php for($i=0;$i<10;$i++){ $line=explode(",",$Result[$i]); ?> <li><a href="item.php?id=<?=$line[0]?>"><?=$line[1]?></a></li> <?php } } ?> </ul> 上記のプログラムを実行すると、以下のようになってしまいます。 ○件見つかりました ・ ・ ・ ・ ・ 私のやりたいことは、以下のようなCSVファイルがあったら ----------------------------------------------------- CSVファイル 1,あいうえお 2,かきくけこ 3,さしすせそ 4,たちつてと 5,なにぬねの ----------------------------------------------------- <li><a href="item.php?id=1">あいうえお</a></li> <li><a href="item.php?id=2">かきくけこ</a></li> <li><a href="item.php?id=3">さしすせそ</a></li> <li><a href="item.php?id=4">たちつてと</a></li> <li><a href="item.php?id=5">なにぬねの</a></li> のように出力したいのですが、 どのように改良すればよいのでしょうか? わかってる方からすれば笑われるようなことかもしれませんが、 PHP初心者なので、本を読みながらいろいろ試してみても、 全然うまくいかないので、どなたか教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • C言語 CSVファイルの読み込み

    前回の質問が説明不足だった為、こちらでもう一度詳しく補足を加え再度質問させていただきます。 ↓前回の質問 http://okwave.jp/qa/q6352672.html 読み込むCSVファイルは数値のみです。 具体的な例として数値をあげさせていただきます。 例:ファイル名 test.csv 10,1.1,1.2,1.3 20,2.1,2.2,2.3 30,3.1,3.2,3.3 上記のような4列3行のCSVファイルをC言語を使用し、 10→a 1.1→b 1.2→c 1.3→d 20→e 2.1→f 2.2→g 2.3→h 30→i 3.1→j 3.2→k 3.3→l といった具合に、任意の列・行の数字を任意の場所へ読み込みをするということが出来ません。 例をプログラムにするとどのようになるのか教えていただきたいです。 よろしくお願いします。

  • ファイルの読み込みと出力

    ファイルの読み込みと出力 Perl初心者です。よろしくお願いします。 file.csvのようなファイルを読み込んで、 out.csvのように出力するプログラムを作成しているのですが 途中で変な改行が度々入っているためどうしてもうまくいきません。 (file.csvですが、実際は1500行以上あります。 また、最後に必ずendが入っています。 下記のcsvですがテキスト形式で表示した内容です。) 初歩的な質問で申し訳ありません。 調べる限り調べたのですが分かりませんでした。 どうかよろしくお願いします。 「file.csv」 "2010/1/1","C","こんにちは","田中","end", "2009/10/2","B","おはよう","斉藤","end", "2007/3/20","E","Good mor ning","佐藤","end", "1988/8/16","F","こんばんは","中 村","end", "1999/1/10","A","Hello","木村","end", "2005/9/17","D","おはようご ざいます","斎藤","end", 「out.csv」(このように出力したいです) C,こんにちは,田中,2010/1/1,end, B,おはよう,斉藤,2009/10/2,end, E,Good morning,佐藤,2007/3/20,end, F,こんばんは,中村,1988/8/16,end, A,Hello,木村,1999/1/10,end, D,おはようございます,斎藤,2005/9/17,end, 「今書いているプログラムです」 #!/usr/local/bin/perl use strict; use Fatal qw/ open /; my $csv_file = "file.csv"; my @csv = &readCsvFile($csv_file); open(OUT,">out.csv"); for(my $i=0; $i<=5; $i++){    print OUT $csv[$i][1],",";    print OUT $csv[$i][2],",";    print OUT $csv[$i][3],",";    print OUT $csv[$i][0],",";    print OUT $csv[$i][4],","; } close(OUT); sub readCsvFile {    open(DATA, $_[0]);    while(<DATA>) {      chomp;      push @csv, [ split(/",\"/) ];    }    close(DATA);    return @csv; }

    • ベストアンサー
    • Perl