質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

1919閲覧

【PHP】配列の採番

tajix_japan

総合スコア132

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/05/21 01:15

編集2017/05/21 01:40

下記のようなタブ区切りのデータをX行目スタートでy行を取得するPHP(fget.php)を組みました。

php

1 2<?php 3$p=$_GET['p']-1; 4$e=$_GET['e']; 5$filepath = './data.txt'; 6$records = array(); 7if (($handle = fopen($filepath, "r")) !== false) { 8 while (($line = fgetcsv($handle, "\t")) !== false) { 9 $records[] = $line; 10 } 11 fclose($handle); 12} 13print_r( array_slice($records,$p,$e,true)); 14$records = array(); 15exit; 16?> 17

下記のよう「1行目から5個」と指定すると指定通り取得可能です。

http://127.0.0.1:8080/fget.php?p=1&e=5

ただ、表示結果は下記のようになります。

Array ( [0] => Array ( [0] => りんご
Array ( [1] => Array ( [0] => みかん
Array ( [2] => Array ( [0] => ばなな
Array ( [3] => Array ( [0] => なし
Array ( [4] => Array ( [0] => キューイ

これをArray表示を無くし

◇1 りんご
◇2 みかん
◇3 ばなな
◇4 なし
◇5 キューイ

と採番したというのが質問の主旨です。
◇の表示部分については出力結果から、後ほど</li><li>タグと入れ替え予定です。

下記のような51行目から5個の場合は
http://127.0.0.1:8080/fget.php?p=51&e=5

◇51 船
◇52 車
◇53 バス
◇54 飛行機
◇55 戦車

と、再度1からの採番でなく行数取得させたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

イメージ説明

php

1<?php 2 3use SplFileObject as File; 4 5// パラメータ受け取り 6$p = max(filter_input(INPUT_GET, 'p') - 1, 0); // 0以上を保証 7$e = filter_input(INPUT_GET, 'e'); 8 9// 実験用ダミーインラインデータ (実際はただのファイル名にする) 10$filename = 'data:text/plain;base64,' . base64_encode("りんご\tapple\nオレンジ\torange\nバナナ\tbanana\nなし\tpear\n"); 11 12// SplFileObjectを使ったほうがコードがきれいになります 13$file = new File($filename, 'rb'); 14$file->setFlags(File::READ_CSV | File::SKIP_EMPTY | File::READ_AHEAD | File::DROP_NEW_LINE); // CSVモード 15$file->setCsvControl("\t"); // セパレータをタブ文字に 16 17// イテレータを配列に変換して切り取り 18$records = array_slice(iterator_to_array($file), $p, $e, true); 19 20?> 21<!DOCTYPE html> 22 23<meta charset="UTF-8"> 24<title>Example</title> 25 26<style> 27ul { 28 list-style: none; 29 margin-left: 0; 30 padding-left: 1.2em; 31 text-indent: -1.2em; 32} 33li:before { 34 content: "◇"; 35 display: block; 36 float: left; 37 width: 1.2em; 38} 39</style> 40 41<ul> 42<?php foreach ($records as $i => $record): ?> 43 <li><?=($i+1)."\t".implode("\t", array_map('htmlspecialchars', $record))?></li> 44<?php endforeach; ?> 45</ul>

投稿2017/05/21 02:33

編集2017/05/21 06:09
mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mpyw

2017/05/21 02:45 編集

(最初olで書いていましたがよく考えたら番号そのまま1カラムとして出せばいいだけだったのでulに変えました)
退会済みユーザー

退会済みユーザー

2017/05/21 02:46

元のコードの面影がないw
tajix_japan

2017/05/21 05:18

有難うございます。 当方の説明が悪く申し訳ございません。 "1\tりんご\tapple\n2\tオレンジ\torange\n3\tバナナ\tbanana\n4\tなし\tpear\n" 上記は元データに採番が既にされているということ理解で作られましたでしょうか? 1\tりんごの1を3に変えたら◇3りんごになりました。 もとデータは果物名が入っているだけで、もともと採番がされていません。 これをArray ( [0] の代わりに◇1を Array ( [1]の代わりに◇2を、 Array ( [105]の代わりに◇106を付けたいと思っています。 説明が悪く本当に申し訳ございません。 可能でしたら、ご教示をお願いいたします。 よろしくお願いいたします。
mpyw

2017/05/21 06:07

>> もとデータは果物名が入っているだけで、もともと採番がされていません。 あ,ほんとですね。勘違いしていました。修正します。
tajix_japan

2017/05/22 13:31

有難うございます。無事表示出来ました。 ◇1 りんご ◇2 みかん いつも本当にありがとうございます。 OKWEB時代から何度も助けていただいております。 深く御礼申し上げます。
guest

0

質問欄にご提示のコードで

Array ( [0] => Array ( [0] => りんご Array ( [1] => Array ( [0] => みかん Array ( [2] => Array ( [0] => ばなな Array ( [3] => Array ( [0] => なし Array ( [4] => Array ( [0] => キューイ

のように表示されるということは、data.txt

タブ区切りのデータ

ではなく、以下のような改行区切りのテキストファイルであるはずです。

りんご みかん ばなな なし キューイ

この認識のとおりであれば、以下のコードで意図通りの結果が得られます。

php

1<?php 2// Test code 3$_GET['p'] = '2'; 4$_GET['e'] = '3'; 5 6 7$p = $_GET['p'] - 1; 8$e = $_GET['e']; 9$filepath = './data.txt'; 10$records = array(); 11if (($handle = fopen($filepath, "r")) !== false) { 12 13 $i = 1; 14 while (($line = fgets($handle)) !== false) { 15 $records[$i++] = $line; 16 } 17 fclose($handle); 18} 19print_r(array_slice($records, $p, $e, true));

実行結果

Array ( [2] => みかん [3] => ばなな [4] => なし )

これを HTMLコードに整形する操作はそう難しくはないはずなので、
そこはご自分で対応してください。

投稿2017/05/22 02:01

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tajix_japan

2017/05/22 13:36

有難うございます。 採番番号の変更をすることが出来ました。 勉強になりました。 深く御礼申し上げます。
guest

0

タグの修正はしていただくとして、コード的にはこんな感じでしょうか(未検証)
現状print_rの行を下記に置き換えてください。

PHP

1echo "<ul>\n"; 2foreach(array_slice($records,$p,$e,true) as $k => $v){ 3 printf("<li>%d %s</li>\n", $p + $k, $v[0]); 4} 5echo "</ul>\n";

投稿2017/05/22 00:30

編集2017/05/22 00:31
ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

・変数$lineNumを宣言する。
・whileの中で$lineNumをインクリメントして$pと一致するまでcontinueする。
・$lineNumが$p以上、$p+$e以下の時に$lineを処理する。
・$recordsに$lineNumと$lineのデータを配列として保存する。

投稿2017/05/21 02:34

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tajix_japan

2017/05/21 05:52

有難うございます。 //・変数$lineNumを宣言する。 //・whileの中で$lineNumをインクリメントして$pと一致するまでcontinueする。 //・$lineNumが$p以上、$p+$e以下の時に$lineを処理する。 //・$recordsに$lineNumと$lineのデータを配列として保存する。 大変申し訳ございません。 当方、趣味でプログラミングをしているもののです。 ご提案いただいた方法について、調べながらトライしたのですが、 結果としては上記のご提案をソースに落とすことができませんでした。 大変恐縮ですが、当方のソースの改変をお願いできませんでしょうか? 本当に申し訳ございません。よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問