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

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

ただいまの
回答率

88.92%

【PHP】配列の採番

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,093

tajix_japan

score 90

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

<?php 
$p=$_GET['p']-1;
$e=$_GET['e'];
$filepath = './data.txt'; 
$records = array(); 
if (($handle = fopen($filepath, "r")) !== false) { 
    while (($line = fgetcsv($handle,  "\t")) !== false) { 
        $records[] = $line;  
    }  
    fclose($handle);  
}  
print_r( array_slice($records,$p,$e,true));
$records = array(); 
exit; 
?>


下記のよう「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からの採番でなく行数取得させたいです。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+4

イメージ説明

<?php

use SplFileObject as File;

// パラメータ受け取り
$p = max(filter_input(INPUT_GET, 'p') - 1, 0); // 0以上を保証
$e = filter_input(INPUT_GET, 'e');

// 実験用ダミーインラインデータ (実際はただのファイル名にする)
$filename = 'data:text/plain;base64,' . base64_encode("りんご\tapple\nオレンジ\torange\nバナナ\tbanana\nなし\tpear\n");

// SplFileObjectを使ったほうがコードがきれいになります
$file = new File($filename, 'rb');
$file->setFlags(File::READ_CSV | File::SKIP_EMPTY | File::READ_AHEAD | File::DROP_NEW_LINE); // CSVモード
$file->setCsvControl("\t"); // セパレータをタブ文字に

// イテレータを配列に変換して切り取り
$records = array_slice(iterator_to_array($file), $p, $e, true);

?>
<!DOCTYPE html>

<meta charset="UTF-8">
<title>Example</title>

<style>
ul {
    list-style: none;
    margin-left: 0;
    padding-left: 1.2em;
    text-indent: -1.2em;
}
li:before {
    content: "◇";
    display: block;
    float: left;
    width: 1.2em;
}
</style>

<ul>
<?php foreach ($records as $i => $record): ?>
  <li><?=($i+1)."\t".implode("\t", array_map('htmlspecialchars', $record))?></li>
<?php endforeach; ?>
</ul>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/21 14: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を付けたいと思っています。

    説明が悪く本当に申し訳ございません。

    可能でしたら、ご教示をお願いいたします。

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

    キャンセル

  • 2017/05/21 15:07

    >> もとデータは果物名が入っているだけで、もともと採番がされていません。

    あ,ほんとですね。勘違いしていました。修正します。

    キャンセル

  • 2017/05/22 22:31

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

    キャンセル

+2

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

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


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

タブ区切りのデータ

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

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

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

<?php
// Test code
$_GET['p'] = '2';
$_GET['e'] = '3';


$p = $_GET['p'] - 1;
$e = $_GET['e'];
$filepath = './data.txt'; 
$records = array(); 
if (($handle = fopen($filepath, "r")) !== false) {

    $i = 1;
    while (($line = fgets($handle)) !== false) {
        $records[$i++] = $line;
    }  
    fclose($handle);  
}  
print_r(array_slice($records, $p, $e, true));

実行結果

Array
(
    [2] => みかん

    [3] => ばなな

    [4] => なし

)


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/22 22:36

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/21 14:52

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

    大変申し訳ございません。
    当方、趣味でプログラミングをしているもののです。
    ご提案いただいた方法について、調べながらトライしたのですが、
    結果としては上記のご提案をソースに落とすことができませんでした。
    大変恐縮ですが、当方のソースの改変をお願いできませんでしょうか?
    本当に申し訳ございません。よろしくお願いいたします。

    キャンセル

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る