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
すでに表示された行を表示しない場合の実装例を示します。
<!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
このQ&Aは役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
回答(1)