こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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>

投稿日時 - 2019-11-02 00:22:28

QNo.9673758

すぐに回答ほしいです

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

すでに表示された行を表示しない場合の実装例を示します。

<!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;
 }
の部分を工夫することで実現できるでしょう。

投稿日時 - 2019-11-02 23:05:42

お礼

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

投稿日時 - 2019-11-06 00:58:29

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問