phpでランダムにcsvデータを表示する方法

このQ&Aのポイント
  • phpを使用して、csvデータをランダムに表示する方法について質問があります。
  • 質問者が提示したphpプログラムでは、csvデータをランダムに抽出し、1つだけ表示しています。
  • 質問者は、表示したデータに色をつけたり、表示させない方法があるかどうか知りたいとしています。
回答を見る
  • ベストアンサー

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>

noname#240930
noname#240930
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • Proof4
  • ベストアンサー率78% (151/192)
回答No.1

すでに表示された行を表示しない場合の実装例を示します。 <!doctype html> <html> <head> <meta charset="UTF-8"> <title>無題ドキュメント</title> </head> <body> <?php // 抽出数 $count = 1; $list = array(); // 表示されたCSVファイルの行のインデックスを格納しておくファイル $displayed_indexes_file = 'displayed.json'; // ファイルが存在すれば読み取り if(file_exists($displayed_indexes_file)){  $displayed = json_decode(   file_get_contents($displayed_indexes_file)  ); }else{  $displayed = []; } // 読み込みCSVファイル $lines = file('test.csv'); $random = range(0, count($lines)-1); shuffle($random); foreach ($random as $r) {  // すでに表示されていたら表示しない  if ( in_array($r, $displayed)) {   continue;  }  $line = $lines[$r];  if ( ! in_array($line, $list)) {   array_push($list, $line);   // 表示するインデックスを追加   array_push($displayed, $r);   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); // 表示されたインデックスを保存 file_put_contents(  $displayed_indexes_file,  json_encode($displayed) ); ?> </body> </html> ※OKWAVEの仕様上、インデントを全角スペースで表現しています。コピペの際はご注意ください。 ポイントは$linesそのものではなく、$linesのインデックスをshuffleする点です。こうすることでCSVファイルの各行を一意に特定し、表示されたデータをファイルに保持することができます。 $displayed_indexes_fileが削除されると表示履歴はリセットされます。 すでに表示したデータに色を付けたいという場合は  if ( in_array($r, $displayed)) {   continue;  } の部分を工夫することで実現できるでしょう。

noname#240930
質問者

お礼

ありがとうございます!勉強になります!

関連するQ&A

  • aaa.csvとbbb.csvを条件で抽出して並べたいです。

    aaa.csvとbbb.csvを条件で抽出して並べたいです。 $array = file("aaa.csv"); foreach($array as $line){ $line = explode("," , $line); if($line[1] == "0"){ $array = file("bbb.csv"); foreach($array as $item){ $item = explode("," , $item); if($item[2] == $line[0]){ $menu = $item[5]; } } } } aaa.csvの$line[1]が「0」のときbbb.csvの$item[2]と$line[0]が一致するものを表示させたいです。 素人ですいませんが教えてください。

    • 締切済み
    • PHP
  • PHPとCSVの表示 もっとスマートにしたい

    現在PHPに手を出し始めた初心者です まだ分からない事だらけですが、できれば教えてください CSVファイルからデータを読み込んで表示するということを 苦戦しながらやっております ただ、1つのPHPファイルだけでの表示方法がわからず、今は3つのPHPファイルにしています 目的は大区分を選択後、小区分の一覧が表示され、小区分の1つを選択すると詳細が表示される という感じのものです まずCSVファイル 大区分,小区分,名称,詳細 1,101,hoge1,詳細1 1,102,hoge2,詳細2 2,201,hogex1,詳細x1 2,202,hogex2,詳細x2 3,301,hogexx1,詳細xx1 という感じに分けています で1つ目のhoge0.phpで <a href="hoge1.php?code=1">大区分(1)</a> ・・・ code が 1 なら hoge1.php で 小区分 1 の一覧を表示します 次に2つ目のhoge1.phpで $code = $_GET['code']; $lines = file('hoge.csv'); foreach($lines as $line) { $line = rtrim($line); list($bno,$sno,$name,$detail) = explode(",", $line); if ($bno==$code) { echo "<a href=hoge2.php?type=$sno>詳細</a>".$name."<br>"; } } type が 101 なら hoge2.php で 小区分 101 にある hoge1 項目の詳細を表示します 最後3つ目のhoge2.phpで $type = $_GET['type']; $lines = file('hoge.csv'); foreach($lines as $line) { $line = rtrim($line); list($bno,$sno,$name,$detail) = explode(",", $line);{ if ($no==$type) { echo $name.$detail; } } } 一応これでやりたい事は実現できたのですが、あまりにも不恰好で・・・ これを1つのPHP内で処理できるようにするにはどうしたらいいでしょうか? スマートになるやり方があれば教えてください

    • ベストアンサー
    • PHP
  • CSVに追加データを挿入したいです。

    この前質問したばかりなのですが、別の質問させてください。 数日頑張ったのですがどうしても出来なくて… やりたいこと ↓のようなものが書かれてあるCSVファイルがあります。 服 トップス 服 ボトムス 服 ブランド このCSVファイルに、 服 トップス なら01&01_01 服 ボトムス なら01&01_02 服 ブランド なら01&01_03 という情報を1列目に付け足したいです。 そこで、以下の配列を作り、 $data array("01&01_01" => "トップス", "01&01_02" => "ボトムス",   "01&01_03" => "ブランド") csvファイルの、「服 トップス」をexplodeで分けました。 $log = "list.csv"; # ログ名 $lines = file("$log"); foreach ($lines as $l) {  $line = explode(",",$l);  $push = $line[0].",".$line[1].",".$line[2].",".$line[3].",\n";  $cate = explode(" ",$line[2]); # $line[2]は、上記の「服 トップス」というデータを挿入しています。  $catea = $cate[1]; # サブカテゴリ名を格納 $cate[1]=トップス  foreach($data as $key => $value){   if($value == $catea){    $LOG[$catea] .= $key.",".$push."\n"; # カテゴリ情報を追加したcsvデータを1行ずつ保存   } } foreach($LOG as $keys => $values){ $file = fopen("list2.csv", 'w'); # カテゴリ情報を追加したcsvデータを書き込み fwrite($file, $values); fclose($file); } すると、foreach($LOG as $keys => $values){ の部分でforeachエラーが出ます。 根本的に記述が間違っているのでしょうか。 お手数かけますが、ご指南よろしくお願いします<(_ _)>

    • ベストアンサー
    • PHP
  • PHPのデータをCSVファイルに保存

    PHPで入力された情報を、CSVファイルに保存したいのですがうまくいきません。 $list=array($name,$jyusyo,$mail,$tel,$text); $fp=fopen('dat/dat.csv','a+'); foreach($list as $line){ fputcsv($fp,split(',',$line)); } fclose($fp); ウェブで調べてこのような形のものを作成してはみたんですが、 エラーが出てしまいます。CSVファイルに保存したい時は、 CSVファイルを先に作るべきなのでしょうか?そうでしたら、 作成の仕方を教えていただきたいです。 初心者ですがよろしくお願いします。

    • 締切済み
    • PHP
  • CSVデータを読み込み、ファイルにカテゴリを分けて書きこむ

    CSVファイル例 01,0101,○○○,○○○□□,010101, 01,0102,○○○,○○○■□,010102, 02,0201,○○○,○○○□□,020101, ・・・・・ というファイルがあったとすると、 1番目の「01」「02」と、分けて別のファイルに保存がしたいです。 書き込み自体は出来るようなのですが、なぜかループが、番号ごとに1回しかされずに、 log/01.cgi 01<>0101<>○○○<>○○○□□<>010101 log/01.cgi 02<>0201<>○○○<>○○○□□<>020101 となってしまい、全ての生成したファイルには1行しか格納されていません。 ちなみに、csvファイルは1万行近くあります。 ソースはこのような感じです。 $log = "△△△.csv"; # ログ名 $lines = file("$log"); foreach ($lines as $l) { $line = explode(",",$l); $push_line = $line[0]."<>".$line[1]."<>".$line[2]."<>".$line[3]."<>".$line[4]."<>\n"; $LOG[$line[0]] .= $push_line; $cate = $line[0].",,".$line[1]; # サブカテゴリ用 $LOG[$cate] .= $push_line; # カテゴリ用ログを保存 } なお、csvファイルは、 01・・・ 02・・・ 01・・・ 03・・・ のようになっているため、全ての行を読み込むことはしていると思います。 しかし、ログファイルにはなぜか1行分しか書き込まれていません。書き込みの文は以下になります。 foreach($LOG as $key => $value){ $explode = explode(",,",$key); if($explode[0]){ $logfile = "./log/".urlencode($explode[0]).".cgi"; } $file = fopen("$logfile", 'w'); flock($file,LOCK_EX); fwrite($file, $value); flock($file,LOCK_UN); fclose($file); 解決法が分かる方、回答のほどよろしくお願いいたします。

    • ベストアンサー
    • 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
  • PHPでHTMLファイル置換 プログラムについて

    以下のプログラムを書きました。 あるHTMLファイルをテンプレートとし、 中に記述している置換文字列を動的に 表示させるというものです。 しかしなかなか表示されません。 どこがおかしいのでしょうか? --template.html-- <html><head><title>test</title></head> <body> 表題 他いろいろ <!-- data replace --> フッター いろいろ </body></html> --index.php-- $page_lines = File("template.html"); $all_lines=''; foreach( $page_lines as $line ){  $all_lines .= $line; } $str = "<div>出力用データいろいろ</div>"; print preg_replace(/<!-- data replace -->/,$str, $all_lines); 以上です。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP 検索 システム with CSV file 

    いつもお世話になっています。 早速ですが、 現在、データベース(DB)を使用しないで、PHPとCSVファイルで簡易データベースを作成しています。 (DBは、それだけでも使い方を覚える必要があり、簡易的に作るにはCSVが良いと考えました。) 一通り、CSVファイルの読み込み、保存をするプログラムを完成させました。 (参考 http://ponk.jp/php_file/index.php?page=5) が、ここで検索機能をつけたいと思い、いろいろ調べていました。 しかし、DBを用いる方法は見つかりますが、なかなかCSVファイルを用いた検索方法がみつかりません。 現在想定しているのは、CSVファイルからデータ(table)を読み込み、その中から検索ワードにヒットするデータ(Column)を見つけるといった感じです。 簡易的には、 <?php $list = array('a','b','c','d','e','f'); $search = "d"; foreach ($list as $value){ if ($search == $value) {print "発見!";} } ?> という感じで作れましたが、今想定しているのは、 <?php $list = array('abcd','1234','xyz','日本'); $search = "y"; foreach ($list as $value){ : : (検索方法) : print "xyz を 発見!"; } ?> という感じです。 なにやら、DBを用いる場合では直接検索できる方法があるみたいですが、DBを用いると今後プログラム引渡しを行う際に、PHP以外にもやることが増えてしまうため、また、規模も小さいため、CSVファイルで済ませることができないかと考えています。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • 行数が30万件ほどあるCSVから、PHP経由でMysqlにデータを投入

    行数が30万件ほどあるCSVから、PHP経由でMysqlにデータを投入しようとしています。 2000件ごとにファイルを分割し、再度各ファイルを読み込みなおして、insertしようと考えました。 ところが、ファイル分割で2000件ごとに区切った場合、最後の2000件に満たない端数分をファイルに落とす方法がわかりません。 どなたか教えていただけないでしょうか。 ※かなり冗長な書き方をしているかと思いますので、改善点等あればご指摘いただければ幸いです。 以下サンプルコード------------------------------------------------------ $count = "0"; $max = "2000"; //ファイルあたりの行数 $file_count = "0"; //ファイル名につける連番 $RF = fopen( "base_file.csv", "r") or die("ファイルが開けません"); while (($data = fgetcsv($RF)) !== false) { if($count < $max){ //順番を入れ替えたり、データをいじるかもしれないのでsprintf $lines.= sprintf("%s,%s,%s,%s,%s,%s,%s\n", $data[0], $data[1], $data[2], str_replace(" "," ",$data[3]), //全角スペースを半角に変換 $data[4], $data[5], $data[6] ); } if($count == $max){ //ファイル名生成 $fileno = zerofill($file_count); $filename = "./files/datafile_".$fileno.".dat"; $WF = fopen($filename, "w"); fputs($WF, $lines); fclose($WF); //書き込みデータを空にする $lines = ""; $file_count++; $count = "0"; } $count++; } fclose($RF); //ファイル名の連番を0で埋める function zerofill($val){ if($val < 100){ if($val < 10){ $ret = "0".$val; } $ret = "00".$val; } return $ret; }

    • ベストアンサー
    • PHP
  • phpでツリー表示

    表題の通り、phpをもちいてツリー表示をしたいと思っています。 そこで、下記のコードの実行結果は以下の通りなのですが、 【このように実行結果を変えたい】のように表示したいと考えています。 どのようにコードを書きかえれば、実行できるでしょうか? 【コード】 <?php function put_tree($no, $line, $broths, $childs, $texts) { echo '<span class="line">' . $line . '</span>'; echo '▼[' . $no . ']' . $texts[$no] . '<br>'; $line = preg_replace('/├$/', '│', $line); $line = preg_replace('/└$/', ' ', $line); $no = isset($childs[$no]) ? $childs[$no] : 0; while ($no > 0) { $tail = $broths[$no] ? '├' : '└'; put_tree($no, $line . $tail, $broths, $childs, $texts); $no = $broths[$no]; } } ?> <html> <head> <title>ツリー表示</title> <style> .line { font-family: "MS ゴシック", monospace; } </style> </head> <body> <?php $logs = array( array(1, 0, 'あああああ'), //記事番号・親記事番号・記事内容 array(2, 1, 'いいいいい'), array(3, 1, 'ううううう'), array(4, 2, 'えええええ'), array(5, 3, 'おおおおお'), array(6, 3, 'かかかかか'), array(7, 0, 'ききききき'), array(8, 6, 'くくくくく'), array(9, 8, 'けけけけけ'), array(10, 7, 'こここここ') ); $roots = array(); $broths = array(); $childs = array(); $texts = array(); foreach ($logs as $log) { list($no, $pno, $text) = $log; if ($pno == 0) { $roots[] = $no; } else { $broths[$no] = isset($childs[$pno]) ? $childs[$pno] : 0; $childs[$pno] = $no; } $texts[$no] = $text; } rsort($roots); foreach ($roots as $root) { put_tree($root, '', $broths, $childs, $texts); } ?> </body> </html> 【実行結果】 ▼[7]ききききき └▼[10]こここここ ▼[1]あああああ ├▼[3]ううううう │├▼[6]かかかかか ││└▼[8]くくくくく ││ └▼[9]けけけけけ │└▼[5]おおおおお └▼[2]いいいいい  └▼[4]えええええ 【このように実行結果を変えたい】 ▼[1]あああああ ├▼[3]ううううう │├▼[6]かかかかか ││└▼[8]くくくくく ││ └▼[9]けけけけけ │└▼[5]おおおおお └▼[2]いいいいい  └▼[4]えええええ ▼[7]ききききき └▼[10]こここここ

    • 締切済み
    • PHP

専門家に質問してみよう