質問するログイン新規登録
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

Q&A

2回答

275閲覧

【PHP】「POSTされた社員番号」と「社員一覧。CSV形式のログファイル」の一致する社員を表示したい。

tera2025

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

0グッド

0クリップ

投稿2025/10/19 23:29

0

0

実現したいこと

-POSTされたスタッフコードと一致するコードのスタッフを抽出して表示したい
-csv形式のログファイルを配列に読み込んで、該当するスタッフコードの部分だけ切り出したい(それができない)。

-そのために、まずcsv形式のログファイルを読み込んで、POSTされたスタッフコード一致するデータを抽出したい
-file関数で読みこみ、explodeで列を分割するが、要素を取り出すと、列の1文字目だけになってしまう。

前提

PHPです

発生している問題・エラーメッセージ

1行を、explodeでタブ区切りで、さらに配列にしないといけないと思い、それはしました。
これで多次元配列になったつもりですが、
$cols[1][0]とるとエラーが出て、
$col[0]だと、列の項目の1文字目しか表示されません。
1文字目ごと区切りの配列にまでなってるのでしょうか?

該当のソースコード

line.txt ログファイル

1 tab区切り (1行目は、列の見出しにしてる) 2num name pass 33 taro 123 42 hanako 333 51 yuji 555 6 7```PHP staff.edit 8//ログを読み込む 9//ファイルを配列に読み込み 10$lines = file('../line.txt'); 11 12/////////////////////////////////////// 13//指定された番号と、同じ番号のスタッフの名前を取り出す。 14//しかし、行や列から、番号だけ取り出す方法がわからない。 15foreach ( $lines as $key => $line ) { 16 $cols=explode("\t",$line); 17 echo "<pre>"; 18 foreach ( $cols as $col ) { 19 20 //これだと、1行すべて表示される 21 echo $col.", "; 22 23 //なぜこれで、項目の1つではなく、各列の一文字目だけになる? 24 echo $col[0].", "; 25 }//foreach 26echo "</pre>"; 27 28}//foreach

試したこと

始め、ファイルを読み込んだだけで2次元配列になったと思ってましたが
1行ずつは、文字列だったので、explodeでtabでさらに配列にしました。
これで2次元配列になってるつもりです。
ところが、そこから特定の列を取り出そうとすると、
$cols[1][0]とるとエラー。

しかも、$col[0]だと、列の項目の1文字目しか表示されません。
これが一番不思議です。
1文字目ごと区切りの配列にまでなってるのでしょうか?

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

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

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

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

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

kikukiku

2025/10/19 23:43

改行が、改行文字(\n)ではないからではないでしょうか? なので、1行づつに分解されないと予想しました。
FKM

2025/10/20 00:14

まずはvar_dump($lines);で期待するCSVの値を全取得できているか、そこから確認してみる習慣をつけた方が後々役立ちます。
tera2025

2025/10/20 00:18

なんか、とりあえず列で抽出できました! 各項目の1文字だけではなく、「番号だけ、名前だけ、パスだけ」表示できました。 一部をこう書き換えたら良かったみたいです。 foreach ( $lines as $key => $line ) { $cols=explode("\t",$line); echo "<pre>"; echo $cols[0]; //番号 echo $cols[1]; //名前 echo $cols[2]; //パスワード echo "</pre>";
tera2025

2025/10/20 00:21

二回目のforeachが不要だったみたいです。 eplodeのあと、cols[n]で、列項目の抽出は成功できました。 >>kukuさま 1行ずつには分割できておりました。改行は、\nになってます。 >>FKMさま 全取得じたいはできてるみたいです。 そこから列ごとの分割でてこづってました。
guest

回答2

0

PHPでは文字列に対して配列のようにアクセスし1文字を取得できると言うだけの話です

毎度の事ながらほかのコメントが酷い

投稿2025/10/20 02:49

u2025

総合スコア112

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

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

0

よくやるのがfgetcsvを使った方法です。
PHP8.4だと書き方が若干非推奨なので、ワーニング出るかもですがこんな感じでどうでしょう?

php

1<?php 2 3declare(strict_types=1); 4 5$fileHandle = fopen('test.tsv', 'r'); 6if ($fileHandle === false) { 7 exit(1); 8} 9 10while (($data = fgetcsv($fileHandle, null, "\t")) !== false) { 11 var_dump($data); 12} 13 14fclose($fileHandle);
array(3) { [0]=> string(3) "num" [1]=> string(4) "name" [2]=> string(4) "pass" } array(3) { [0]=> string(1) "3" [1]=> string(4) "taro" [2]=> string(3) "123" } array(3) { [0]=> string(1) "2" [1]=> string(6) "hanako" [2]=> string(3) "333" } array(3) { [0]=> string(1) "1" [1]=> string(4) "yuji" [2]=> string(3) "555" }

ちなみに、タブ区切りはcsvではなくtsvが正しいかなーと思ったり。

投稿2025/10/20 01:11

nnahito

総合スコア2016

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問