CSVから特定の行だけ抽出し、配列に入れる方法について - PHPプロ!Q&A掲示板

4842

  • 0P

CSVから特定の行だけ抽出し、配列に入れる方法について

質問日時 / 2017年5月11日 00:15    回答数 / 1件

Questioner:  atushi2017  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

Web担当者に急遽抜擢されたPHP初心者です。

前任者のプロジェクトを急遽引き継ぐことになったのですが、
次のようなことをしたいのですが、どのようにすれば良いのか皆目見当がつきませんでした。
PHPに詳しい皆さんに、どのようなコードを書けば良いのかアドバイスをいただければ幸いです。

■前提
・CSVデータに店舗の情報が入っている
・1行目が項目名、2行目以降が各店舗のデータ
・このデータを元に各店舗情報のWebページを表示したい


■前任者が考えていたこと/実現したいこと
・各店舗毎にPHPファイルを用意する
・PHPのファイル名はCSVの「id」項目と同一のものとする
・PHPのヘッダでCSVを読み込む
・ただし、CSVはデータが多いので「ファイル名(id)」の行だけ読み込む
・読み込んだデータを項目名で配列形式にする
・そのデータを表示する

●CSVデータ
id,address,name,message,tel,staff,hp
tenpo-tokyo,東京都港区1-2-3,東京本店,誠心誠意サービスします,111-222-33348,山田一郎,http://www.hoge.com/tokyo
tenpo-kanagawa,神奈川県横浜市9-8-7,横浜ランドマーク店,真心重視のクリーニング店です,111-222-4538,佐藤二郎,http://www.hoge.com/kanagawa
tenpo-chiba,千葉県舞浜市555,舞浜駅前店,しわ一つないクリーニングは当店にお任せ,153-7254-454,山中三郎,http://www.hoge.com/chiba
tenpo-saitama,埼玉県新三郷777-987,埼玉ステーション,安さ地域イチバン店,16-644-5555,岡田四郎,http://www.hoge.com/saitama
tenpo-ibaraki,茨城県茨木市1234,茨城出張所,年中無休です,254-454-44,岩田五郎,http://www.hoge.com/ibaraki


●各店舗毎のPHPファイルの中身(tenpo-tokyo.phpの場合)
<?php
// PHPファイル名と同じIDの行をCSVから取得(←どう記述すればいい???)
// 取得データを以下のように加工(←どう記述すればいい???)
 $address = "東京都港区1-2-3":
 $name = "東京本店":
 $message = "誠心誠意サービスします":
 $tel = "111-222-33348":
 $staff = "山田一郎":
 $url = "http://www.hoge.com/tokyo":
 ?>

// ページとして表示
この店舗は「<?php echo $name; ?>」です。
住所は<?php echo $address; ?>で、
Tel番号は<?php echo $tel; ?>となっています。
店長は<?php echo $staff; ?>が努めています。
<?php echo $staff; ?>店長からのメッセージは次の通りです。
<?php echo $message; ?>

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimixまずはご自分で書ける範囲で(書けない部分も出来たと

回答一覧

並び替え:

A01
answerershimix [5月11日 04:16]

まずはご自分で書ける範囲で(書けない部分も出来たと仮定してコメントを入れて)書いてみてください。

「PHPファイル名と同じIDの行をCSVから取得」がわからないということですが、「PHPファイル名を取得する」のがわからないのか、「CSVデータを読み込む」のがわからないのか、「ファイル名と同じIDの行を選別する」のがわからないのか、がこちらではわかりません。

#全部わからないと言われると、うーん・・・ですが(汗

ざっくりと下記のように書けるとは思います(未検証ですので参考程度に)。
  1. <?php
  2. // 自分のファイル名を得る
  3. $file = basename(__FILE__);
  4. // 拡張子を除去
  5. $name = substr($file0strrpos($file'.'));
  6.  
  7. $fp = fopen('test.csv''r');
  8. // CSVファイルを読み込む
  9. while ($row = fgetcsv($fp)) {
  10.   // 要素数が7以上だったら配列から各変数に格納
  11.   if (count($row) >= 7) {
  12.     list($id$address$name$message$tel$staff$url) = $row;
  13.     // IDがファイル名と一致したらbreak
  14.     if ($id === $name) { break}
  15.   }
  16. }
  17. // whileループをbreakで抜けたか(同じIDのデータがあったか)をチェック
  18. if (feof($fp)) { die('illegal id')}
  19. ?>
  20. この店舗は「<?=$name?>」です。
  21. 住所は<?=$address?>で、
  22. Tel番号は<?= $tel?>となっています。
  23. 店長は<?= $staff?>が努めています。
  24. <?= $staff?>店長からのメッセージは次の通りです。
  25. <?= $message?>
個人的には同じファイルを店舗数を同じだけ作るのはちょっと避けたいですね。
おそらく xxx.php?id=tenpo-tokyo のようにURLにQueryStringを付けてアクセスさせるのが嫌だったのだろうと思います。そういう場合は.htaccessを使って、xxx/tenpo-tokyoへのアクセスを内部Rewrite(ブラウザのURLは変わらない)でxxx.php?id=tenpo-tokyo にすればxxx.phpだけで済みます。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)

Q&A掲示板 新着情報