下から数えて10行目から最後までを表

このQ&Aのポイント
  • csvデータを下から数えて10行目から最後までを表します。
  • 表示される内容はIPと日時のみです。
  • 最新の10件のデータを表示したい場合、IPと日時以外の項目も表示する必要があります。
回答を見る
  • ベストアンサー

csvデータを下から数えて10行目から最後までを表

<?php if (have_posts()): ?> <?php if(isset($_GET['s']) && empty($_GET['s'])) { echo '検索キーワード未入力'; } else { echo '“'.$_GET['s'] .'”の検索結果:'.$wp_query->found_posts .'件'; // 検索キーワードと該当件数を表示 // chmodで書き込み権限を付与 $filename = chmod("test.csv", 0775); // PHPでcsvファイルを読み込みする $f_path = "test.csv"; var_dump($f_path); // 送信内容をShift_JISに変更 mb_convert_variables('Shift_JIS', 'UTF-8', $ShiftJIS); // 書き方はおそらくあってる $keyword_data = array(date('Y-m-d-G-i-s'), $_SERVER["REMOTE_ADDR"],$_GET['s'].PHP_EOL); // ファイルを開くか、新しいテキストファイルを作って最後に追加書き込み $fp = fopen('test.csv', 'a'); // ファイルに対する処理を行う前にファイルをロックして、作業中は他の人がそのファイルに作業を行えないようにする、排他的ロック flock($fp, LOCK_EX); // CSVファイルにフォームの送信内容を記入しています fputcsv($fp, $keyword_data); // ロック解除 flock($fp, LOCK_UN); // CSVファイルをクローズして終わり fclose($fp); } ?> <ul> <?php while(have_posts()): the_post(); ?> <li> <a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a> </li> <?php endwhile; ?> </ul> <?php else: ?> 検索されたキーワードにマッチする記事はありませんでした <?php endif; ?> <?php setlocale(LC_ALL, 'ja_JP.UTF-8'); $fp = fopen('test.csv', 'r'); flock($fp,LOCK_SH); $rows = array(); while ($row = fgetcsv($fp)) array_push($rows, $row); flock($fp,LOCK_UN); fclose($fp); foreach (array_slice($rows, -10) as $row) vprintf("%s %s\n", $row); var_dump($row); ?> var_dump($row);で確認したところ 2021-09-07-4-27-36 126.156.166.227 2021-09-07-4-27-52 126.156.166.227 2021-09-07-4-31-03 126.156.166.227 2021-09-07-4-50-36 126.156.166.227 2021-09-07-4-52-03 126.156.166.227 2021-09-07-4-52-15 126.156.166.227 2021-09-07-4-52-26 126.156.166.227 2021-09-07-5-01-27 126.156.166.227 2021-09-07-5-14-25 126.156.166.227 2021-09-08-4-48-06 126.133.202.39 array(3) { [0]=> string(18) "2021-09-08-4-48-06" [1]=> string(14) "126.133.202.39" [2]=> string(40) "ううううううううううううう " } と出てます 2021-09-03-13-28-52,126.255.28.185,"ううう " 2021-09-03-13-29-46,126.255.28.185,"ううう " 2021-09-03-13-29-49,126.255.28.185,"ううう " 2021-09-06-14-43-33,126.204.198.239,"ううううううううううううう " 2021-09-06-14-45-37,126.204.198.239,"ううううううううううううう " 2021-09-07-3-09-52,126.156.166.227,"ううううううううううううう " 2021-09-07-3-10-34,126.156.166.227,"ううううううううううううう " 2021-09-07-3-15-56,126.156.166.227,"ううううううううううううう " 2021-09-07-3-17-27,126.156.166.227,"ううううううううううううう " 2021-09-07-3-24-07,126.156.166.227,"ううううううううううううう " 2021-09-07-3-24-29,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-04,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-19,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-33,126.156.166.227,"ううう " 2021-09-07-3-26-02,126.156.166.227,"ううう " 2021-09-07-3-26-40,126.156.166.227,"ううう " 2021-09-07-3-27-08,126.156.166.227,"ううう " 2021-09-07-3-27-27,126.156.166.227,"ううう " csvにはこのように表示されていて、下の10件最新のものを表示したいのですが、現状はIPと日時のみ表示されます。

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

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6619/9381)
回答No.1

最後の表示部分のこちら、 > while ($row = fgetcsv($fp)) array_push($rows, $row); fgetcsv() は、1行のcsvデータをカンマで分割した、配列を返します。 それを$row に代入しているのがちょっと妙なところ。 「下から10行を表示する」ということを考えたとき、カンマで分割してもらう必要はありません。 fgetcsv() → fgets() にして1行単位で読んでみてはどうですか?

php_learn
質問者

補足

<?php if (have_posts()): ?> <?php if(!isset($_GET['s']) || empty($_GET['s'])) { echo '検索キーワード未入力'; } else { echo '“'.$_GET['s'] .'”の検索結果:'.$wp_query->found_posts .'件'; // 検索キーワードと該当件数を表示 // chmodで書き込み権限を付与 $filename = chmod("test.csv", 0775); // PHPでcsvファイルを読み込みする $f_path = "test.csv"; var_dump($f_path); // 送信内容をShift_JISに変更 mb_convert_variables('Shift_JIS', 'UTF-8', $ShiftJIS); // 書き方はおそらくあってる $keyword_data = array(date('Y-m-d-G-i-s'), $_SERVER["REMOTE_ADDR"],$_GET['s'].PHP_EOL); // ファイルを開くか、新しいテキストファイルを作って最後に追加書き込み $fp = fopen('test.csv', 'a'); // ファイルに対する処理を行う前にファイルをロックして、作業中は他の人がそのファイルに作業を行えないようにする、排他的ロック flock($fp, LOCK_EX); // CSVファイルにフォームの送信内容を記入しています fputcsv($fp, $keyword_data); // ロック解除 flock($fp, LOCK_UN); // CSVファイルをクローズして終わり fclose($fp); } ?> <ul> <?php while(have_posts()): the_post(); ?> <li> <a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a> </li> <?php endwhile; ?> </ul> <?php else: ?> 検索されたキーワードにマッチする記事はありませんでした <?php endif; ?> <?php setlocale(LC_ALL, 'ja_JP.UTF-8'); $fp = fopen('test.csv', 'r'); flock($fp,LOCK_SH); $rows = array(); while ($row = fgetcsv($fp)) array_push($rows, $row); flock($fp,LOCK_UN); fclose($fp); foreach(array_slice($rows, -10) as $row) vprintf("%s %s\n", array($row[0], $row[2])); ?> こちらのコードで出力されました

その他の回答 (1)

回答No.2

あんまり深く考えず。。 https://www.php.net/manual/ja/function.file.php 最初から配列に突っ込む関数があります。 なので、 $data= file (ファイル名); で読み込み、何行あるかを調べる。 $count=count($data); if ($count<10) { // 元々10行以下なら全部とする // 全行を表示 }else{ // 上のチェックで、10行以上ある事が保証される為。 for ($index=$count-10;$index<$count;$index++) { 後ろから10行前から、最後までをダンプ   $data[$index]が「行」ですので、   カンマ区切りでも、スペース区切りでも・・・ $csv = explode(',', trim($data[$index]) ); テストなら、print_r($csv)などで、ダンプを!  } } なので、ロックとかしなくても、1命令で 完結させるほうが、いいかと。 ただし!! それだと、CSVが10万行あったらどうするの?ってな 問題がでるでしょうが。。 今回は、短いものだと仮定しての回答です。 また、エスケープも考慮なしです。

php_learn
質問者

補足

>$keyword_data = array(date('Y-m-d-G-i-s'), $_SERVER["REMOTE_ADDR"],$_GET['s'].PHP_EOL); 日付、IPアドレス、投稿内容の3つのカラムで格納したのを無視して、 $rows = array_slice($rows, -10); > vprintf("%s %s\n", $row); としていたので、格納したデータと表示したいデータが結びついていないのが原因でした。 また3カラムで格納したのに、2カラムで表示しようとして空データが返ってきていたようです。

関連するQ&A

  • CSVファイルの上書き

    CSVファイルを$line[0] = $nowの時、上書きするということをしたいのですが、array_spliceでうまくいきません。 アドバイスお願いします。 $fp = fopen('log/order.csv', 'a+'); flock($fp,LOCK_EX); if ($fp) { require_once( "./common.php" ); $AddressData = LoadTextFile( "./log/order.csv", "SJIS", "SJIS" ); if ( $AddressData == false ) { exit; } else { for ( $i = 0; $i < sizeof( $AddressData ); $i++ ) { $line = explode( ",", $AddressData[ $i ] ); if($line[0] = $now){ array_splice($line, 1, 3, array("1","2","3")); #fputs($fp, $buf2); flock($fp,LOCK_UN); fclose($fp); } } } }

    • 締切済み
    • PHP
  • csvの特定キーワード抽出後、その前後のキーワードを表示するには

    csvの特定キーワード抽出後、その前後のキーワードを表示するには -----sample.csv f01,名前01,説明01 d03,名前02,説明02 y12,名前03,説明03 -----呼び出しhtml sample.php?key=d03 -----sample.phpの処理 <?php $file_name = "sample.csv"; $file = @fopen($file_name, "r") or die("Data File Open Error"); flock($file, LOCK_SH); while (!feof($file)) { $buf = fgets($file, 4096) ; $data = split(",", $buf) ; if ($data[0] == $_GET["key"]) { $sampleid = $data[0] ; $samplename = $data[1] ; $sampleexp = $data[2] ; } } flock($file, LOCK_UN); fclose($file) ; ?> <h1><?php echo $samplename ?></h1> <h2><?php echo $sampleid ?></h2> <p><?php echo $sampleexp ?></p> 上記のようなフローの時に、sample.csv内の前後のデータをsample.php内で呼び出したいのですが、どうコードを書けばいいのかご教示ください。↓ <a href="ひとつ前のデータ">ひとつ前のデータ</a> <a href="ひとつ後のデータ">ひとつ後のデータ</a>

    • ベストアンサー
    • PHP
  • csvファイルを読み込んだ時の「ゼロ」の扱い

    すみません、教えてください。 test.csv というファイルに、 佐藤, 東京 田中, 大阪 中西, 京都 というデータが入っていたとして、以下を使って読み込むと、 <?php $file_name = "test.csv"; $fp = fopen( $file_name, 'r' ); $data = array(); while( $ret_csv = fgetcsv( $fp, 256 ) ){ for($col = 0; $col < count( $ret_csv ); $col++ ){ $data[$col][$row] = $ret_csv[$col]; } $row++; } fclose( $fp ); var_dump($data); ?> 以下のように、 [0] ではなく [""] となってしまうのですが、これを [0] にする方法はないでしょうか。 array(2) { [0]=> array(3) { [""]=> string(6) "佐藤" [1]=> string(6) "田中" [2]=> string(6) "中西" } [1]=> array(3) { [""]=> string(6) "東京" [1]=> string(6) "大阪" [2]=> string(7) "京都 " } } よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • CSVを使ったパスワード変更処理について

    CSVを使ったパスワード変更処理について 以下のソースをどういじれば変更が可能か申し訳御座いませんが、 どなたか分かるかたご教授願いますでしょうか? $post = $_POST; $org_file=fopen("logindata.csv","r"); $tmp_file=fopen("guest.tmp","w+"); flock($org_file,LOCK_SH); flock($tmp_file,LOCK_EX); $line =date("Ymd-H:i:s").","; $line.=$_POST['mail'].","; $line.=$_POST['pw2'].","; fputs($tmp_file,$line."\n"); while($row=fgets($org_file,1024)){ if($temp[1]==$post['mail'] && $temp[2]==$post['pw']){ } else{ fputs($tmp_file,$row); } } flock($tmp_file,LOCK_UN); flock($org_file,LOCK_UN); fclose($tmp_file); fclose($org_file); unlink("logindata.csv"); rename("guest.tmp","logindata.csv"); echo "パスワード変更しました。"; exit;

    • 締切済み
    • PHP
  • PHP5で、utf-8形式のcsvファイルを読み込む際、常にファイル内

    PHP5で、utf-8形式のcsvファイルを読み込む際、常にファイル内容の行数+1を返すようにしたいのですが、初回(ファイルの中身がないとき)がうまくいきません。どうなおせば、よいでしょうか。 ■うまく動作しないコード setlocale(LC_ALL, 'ja_JP.UTF-8'); $fp = fopen('data.csv','r'); $data = array(); while ($row= fgetcsv($fp)) { $data[] = $row; } $no = 1; if (0 < count($data)) { $no = count($data); $no++; } var_dump($no); fclose($fp); ■現在の状態 ---------------------------------------- ▽csvファイルの内容が、下記の場合 1,名前,内容 2,名前,内容 最終的なvar_dump($no);は、3 → O.K. ---------------------------------------- ▽csvファイルの内容が、下記の場合 1,名前,内容 最終的なvar_dump($no);は、2 → O.K. ---------------------------------------- ▽csvファイルの内容が、下記(中身が何もない)の場合 最終的なvar_dump($no);は、2 → × この部分を1にしたいのですが、どうすればよいでしょうか。 ---------------------------------------- また、csvファイルの内容が空の(つもりの)状態で、 var_dump($data);すると、下記表示となってしまいます。 これは、なぜでしょうか? array(1) { [0]=> array(1) { [0]=> string(3) "?" } }

    • ベストアンサー
    • PHP
  • htmlで作成したフォームにcsvファイルのデータを表示するには

    <?php //ファイルを開く $fp = fopen('maillog.csv', 'r') or die('ファイルが開けません'); //テーブルを出力 echo '<table border="0">'; echo '<tbody>'; while ($field_array = fgetcsv($fp, 4096, ',', '"')) { echo '<tr>'; foreach ($field_array as $key=>$value) { if(!in_array($key,Array(0,1,2,3,4,5,6,7))) continue; echo '<td nowrap>'.htmlspecialchars($value, ENT_QUOTES).'</td>'; } echo '</tr>'; } echo '</tbody>'; echo '</table>'; //ファイルを閉じる fclose($fp); ?> 簡単な一覧は、できるのですが 下記、フォームに対してデータの一覧を表示するには どうすれば良いのでしょうか? 教えてください

    • 締切済み
    • PHP
  • PHPでCSVデーターの表示について

    PHPでCSVデーターの表示について 教えてください。PHPでCSVデーターを表示したいのですが一覧表示ではなくテキストをクリックして特定のデーターを表示させようと考えております。 CSVデーターの中身(CSV.csv) 一郎,男,20歳 二郎,男,22歳 一子,女,24歳 二子,女,26歳 --data.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<p>',<a href="01.php">' . $name . '</a>','</p>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 一郎をクリックしたら一郎のデーターだけを(01.php)で表示させたいのですがよく分りません。 01.phpは今のところ一覧表示されるものを置いてあります。 --01.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<table border=1>'; echo '<tr>'; echo '<td>','名前','</td>'; echo '<td>'.$name.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','性別','</td>'; echo '<td>'.sex.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','年齢','</td>'; echo '<td>'.$age.'</td>'; echo '</tr>'; echo '</table>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 本を読んだり、ググったりしてヒントになる様な物を探しているのですが中々見つかりません。 初心者で申し訳ありませんが、どなたか教えていただけないでしょうか?

    • ベストアンサー
    • PHP
  • CSV読み込みの数制限

    CSVを読み込み表示について質問です。 CSVのデータは全部で35件あり読み込む順番に$hyoujijyunの配列に 値をいれています。 やりたいことは1ページ目(view.php?page=1)に配列の先頭から18個の データを表示させそれ以降は2ページ目(view.php?page=2)へ表示させ それぞれのページに次のページへ飛ぶリンクと前へ戻るリンクを表示 したいと思っているのですがこの場合どのようにすればいいの でしょうか? for文を使えばいいのかな?と思い考えてみたのですが応用の方法が わからずです^^; 現状は以下のソースです。hyoujijyunの値が全て表示されています。 if (! $fp = @fopen("data.csv" ,"r")) { print "ファイルを開けません!"; exit(); } while (($filedata= fgetcsv($fp, 10000, ",")) !== FALSE) { $datas[]= $filedata; } fclose($fp); $hyoujijun = array (2, 10, 18, 27, 21, 28, 23, 20, 13, 1, 7, 14, 12, 5, 11, 35, 29);// 並びに規則性はなく実際には35個の値が入る foreach($hyoujijun as $row) { echo "<tr>\n"; echo "<td>{$datas[$row][0]}</td>\n"; echo "<td>{$datas[$row][3]}</td>\n"; echo "<td class=\"{$datas[$row][2]}\">{$datas[$row][3]}</td>\n"; echo "<td>{$datas[$row][4]}</td>\n"; echo "<td>{$datas[$row][5]}</td>\n"; echo "<td>{$datas[$row][6]}</td>\n"; echo "<td>{$datas[$row][7]}</td>\n"; echo "<td>{$datas[$row][8]}</td>\n"; echo "<td>{$datas[$row][9]}</td>\n"; echo "<td colspan=\"3\">{$datas[$row][10]}</td>\n"; echo "</tr>\n"; }

    • 締切済み
    • PHP
  • CSV...

    <?php $csv = "system.csv"; $array = file($csv); $c = count($array); $item = 5; //1ページの表示件数 $page = $_GET['page']; //ページ番号 $start = $page * $item; //pageが0 $matched = 0; //条件にマッチした数 foreach( $array as $i => $row ) { $row = trim( $row ); list($id[$i],$name[$i],$sex[$i],$age[$i],$stamp[$i]) = split("\,",$array[$i]); if($sex[$i] == 1 ) { if( $matched >= $start ) { echo $name[$i]; } $matched++; if( $matched - $start >= $item ) break; } } echo "登録件数:$i件"; if( $page ) echo '<a href="search_4?page=' . ( $page - 1 ) . '">前へ</a>'; else echo '前へ'; if( $i < $c ) echo '<a href="search_4?page=' . ( $page + 1 ) . '">次へ</a>'; else echo '次へ'; ?> かなりアホな質問かもしれませんが、動くかテストしようと思い 次へのリンクを押すとsearch_4?page=1となりNot Foundと表示されます。 どうしてですか?

    • ベストアンサー
    • PHP
  • PHPでcsvファイルを一覧表示するにはどうすれば良いのでしょうか?

    <?php //ファイルを開く $fp = fopen('maillog.csv', 'r') or die('ファイルが開けません'); //テーブルを出力 echo '<table border="1">'; while ($field_array = fgetcsv($fp, 10000, ',', '"')) { echo '<tr>'; foreach ($field_array as $value) { echo '<td>'.htmlspecialchars($value, ENT_QUOTES).'</td>'; } echo '</tr>'; } echo '<table>'; //ファイルを閉じる fclose($fp); ?> プログラムだと、全ての項目が表示されてしまうので 少ない項目(3~4つ)で表示できるにはどうすれば良いのでしょうか? また、各項目毎のタイトルも付けたいのですが お願いします。

    • 締切済み
    • PHP