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

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

新規登録して質問してみよう
ただいま回答率
85.37%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

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

Q&A

解決済

1回答

2126閲覧

外部のテキストファイルから多次元配列を作りたい。

Goethe

総合スコア17

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

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

0グッド

0クリップ

投稿2021/07/11 08:09

編集2021/07/11 09:22

外部のテキストファイルを1行ずつ読み込み、多次元配列を作りたいです。

--------試したこと-------

【sample.txt(外部ファイル)】
サンプル1,リンゴ,バナナ
サンプル2,ミカン,イチゴ
サンプル3,グレープ,レモン

PHP

1<?php 2 $file_name = "sample.txt"; /*読込ファイルの指定*/ 3 4 $ret_array = file( $file_name ); /*ファイルを全て配列に入れる*/ 5 6 print_r($ret_array); 7 8?> 9

【出力結果】
Array ( [0] => サンプル1,リンゴ,バナナ [1] => サンプル2,ミカン,イチゴ [2] => サンプル3,グレープ,レモン )


外部ファイルを一行ずつ配列にするのではなく、一行のうちのカンマ区切りの多次元配列を作りたいです。一行の配列のなかに、さらにカンマ区切りの配列が並ぶ感じです。今のままだと「リンゴ」だけを抽出できないと思いました。

PHP初心者ですが、よろしくお願い致します。

-----回答をいただいて修正したコード-----

PHP

1<?php 2$file_name = "sample.txt"; /*読込ファイルの指定*/ 3 4$ret_array = file( $file_name ); /*ファイルを全て配列に入れる*/ 5 6foreach($ret_array as $value) { 7$val = explode(',', $value); 8} 9 10print_r($val); 11 12?>

【出力結果】
Array ( [0] => サンプル3 [1] => グレープ [2] => レモン )

なぜサンプル3の最後の行だけ出力されるのでしょうか?
1行目から格納し、出力を行いたいです。

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

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

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

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

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

takasima20

2021/07/11 12:20

どうでもいいけど file($file_name , FILE_IGNORE_NEW_LINES) てやると改行コード外したのがとれるよ。
Goethe

2021/07/12 04:55

ご回答ありがとうございます。 一行目のテキストデータだけ配列に入るみたいです。
guest

回答1

0

ベストアンサー

file()の取得結果をループし、それぞれ,explode()
一発では難しいと思います。fgetcsv()も試してみてください。

今のままだと「リンゴ」だけを抽出できないと思いました。

やり方次第でできなくはないですけど、もう少し具体的な用途を決めてから文字列含めた情報操作をしたほうが良いと思います。

投稿2021/07/11 08:22

編集2021/07/11 08:24
m.ts10806

総合スコア80875

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

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

Goethe

2021/07/11 08:33

ご回答ありがとうございます。 用途は取得した情報を、すでに作られたHTMLの各所に埋め込むものです。外部ファイルのデータは実際はもっとありますが、質問のために簡略化しました。 file()の取得結果をループし とありますが、ここをどう記述するのか分かりませんでした。すみません。
m.ts10806

2021/07/11 08:37

配列で取得できてるのですから、 そのままforeachに突っ込めばそれぞれ1行が文字列で取得できます。 あとはその文字列をexplodeし、別の配列に保持する。
Goethe

2021/07/11 09:13 編集

<?php $file_name = "sample.txt"; /*読込ファイルの指定*/ $ret_array = file( $file_name ); /*ファイルを全て配列に入れる*/ foreach($ret_array as $value) { $val = explode(',', $value); } print_r($val); ?> 【出力結果】 Array ( [0] => サンプル3 [1] => グレープ [2] => レモン ) となりました。なぜサンプル3の最後の行だけ出力されるのでしょうか?
m.ts10806

2021/07/11 09:27

$val = これだと代入です。 上書きし続けます。 「配列を作りたい」のが命題なのですから、 例えばこう $val=[]; foreach($ret_array as $value) { $val[] = explode(',', $value); }
Goethe

2021/07/11 09:37

御返事ありがとうございます。 <?php $file_name = "sample.txt"; /*読込ファイルの指定*/ $ret_array = file( $file_name ); /*ファイルを全て配列に入れる*/ $val=[]; foreach($ret_array as $value) { $val[] = explode(',', $value); } print_r($val); ?> これだと何も出力されなくなりました。。。 確かに以前のコードだと上書きされ続けているようでした。
Goethe

2021/07/11 10:09

いただいたコードをコピペしても、Web上で何も表示されません。。。
Goethe

2021/07/11 10:30

Web上にアップして確認しているのですが、 <?php ini_set('display_errors', "On"); ?> と記述しても、何も表示されないですね。。。
Goethe

2021/07/11 10:36

<?php $ret_array = []; $ret_array[] = "サンプル1,リンゴ,バナナ"; $ret_array[] = "サンプル2,ミカン,イチゴ"; $ret_array[] = "サンプル3,グレープ,レモン"; $val=[]; foreach($ret_array as $value) { $val[] = explode(',', $value); } print_r($val); ?> これでWebにアップしてみたのですが、表示されないですね。。。 $val=[]; ↑この[]を外すと表示されますが、同時に上書きもされてしまいます。
m.ts10806

2021/07/11 20:20

毎スクリプトに書く必要があります。 <?php ini_set('display_errors', "On"); $ret_array = []; $ret_array[] = "サンプル1,リンゴ,バナナ"; $ret_array[] = "サンプル2,ミカン,イチゴ"; $ret_array[] = "サンプル3,グレープ,レモン"; $val=[]; foreach($ret_array as $value) { $val[] = explode(',', $value); } print_r($val); >↑この[]を外すと表示されますが、 そこがダメなら 冒頭もダメなはずです。 $ret_array = []; でもこれが本当に使えないなら相当古いPHPのはずです。(5.4未満)
m.ts10806

2021/07/11 20:20

ひとまず、PHP5.4以降なら再現しません。再現しないことには何とも言えないということで・・
Goethe

2021/07/12 04:59

ご丁寧にありがとうございます。 自分のところにサーバーがないので、見れる人に今バージョンの確認をとっています。 他の記述で、配列からさらに配列を作る(多次元配列)を再現することは難しいでしょうか?
m.ts10806

2021/07/12 05:15

phpinfo(); 実行すれば見れます。 >他の記述で、配列からさらに配列を作る(多次元配列)を再現することは難しいでしょうか? 回答にもう一つ書いてます。 fgetcsv()
Goethe

2021/07/12 06:00

バージョン確認したところ、5.3.3で不具合を考慮しバージョンアップする予定はないそうです。 fgetcsvで以下のように試してみました。 <?php $fp = fopen('sample.csv', 'r'); $data = fgetcsv($fp); var_dump($data); fclose($fp); ?> 【出力結果】 array(3) { [0]=> string(1) "1" [1]=> string(0) "" [2]=> string(0) "" } 出力内容が空になっているのは、なぜですか?
Goethe

2021/07/12 06:07

直接書いてみようと思って、下記のように書いても何も出力されませんでした。。。 <?php $ret_array = [ ["サンプル1", "リンゴ", "バナナ"], ["サンプル2", "ミカン", "イチゴ"], ["サンプル3", "グレープ", "レモン"] ]; print_r($ret_array); ?>
m.ts10806

2021/07/12 06:55

[]をarray() に変更すればOKです。省略記法なので。 不具合よりセキュリティリスクを取るべきかと思います。そのほうが損害が大きい。 まあ上の考えは上にしか分からないし、それで何かあっても責任取るんでしょうから…。 なので、定義は[]ではなくarray()におきかえてください。(代入のところはそのままでいい) たぶんサーバーのエラーログには出てるはずですよ。 eclipse上の構文チェックではunexpected '[' が出てます。 出力書いたにもかかわらず無ということはそれ以前もしくは構文エラーでそもそも実行ができない状態ということです。 PHPに限らずバージョンは提示必須です。何も書いてないと現時点で最新か、サポート終わってないバージョンで確認しますから。 私が提示したpaiza.ioは8.0.1ですね。
Goethe

2021/07/12 07:26

バージョンの件、大変勉強になりました。ありがとうございます。 <?php $ret_array = array( array("サンプル1", "リンゴ", "バナナ"), array("サンプル2", "ミカン", "イチゴ"), array("サンプル3", "グレープ", "レモン") ); print_r($ret_array); ?> 上記の方法で希望の出力結果が得られました。 これを外部ファイルから取得したいです。 <?php $file_name = "sample.txt"; /*読込ファイルの指定*/ $ret_array = file( $file_name ); /*ファイルを全て配列に入れる*/ $val=array(); foreach($ret_array as $value) { $val = explode(',', $value); } print_r($val); ?> と記述しても、変わりませんでした。
m.ts10806

2021/07/12 07:38

ですから $val[] = explode(',', $value); ↑この左辺の[]は必要なんですって。$valだけだと上書きし続けると先に書いてます。 答えだけ求めるのではなくデバッグもしましょう。 PHPマニュアルも確認しましょう。 https://www.php.net/manual/ja/language.types.array.php
Goethe

2021/07/12 07:57

すみません、そのマニュアルは初めて見ました。ありがとうございます。 おかげさまでprint_rで希望通りの配列になってくれたのですが、「echo $ret_array[1][1];」などechoで呼び出そうとすると、黒背景の「?」が出て正しく出力されません。これは全く別の問題なのでしょうか?
Goethe

2021/07/12 07:59

すみません、「ret_array」と「val」を混合してました。解決しました。ご丁寧にありがとうございます。
m.ts10806

2021/07/12 08:01

>そのマニュアルは初めて見ました。ありがとうございます。 はじめから回答にリンクで提示してますよ。 初心者の初期命題はPHPマニュアル(他の言語でも公式ドキュメント)の活用です。できない人がteratailでもずっと初心者やってます。 >黒背景の「?」が出て正しく出力されません。これは全く別の問題なのでしょうか? それはわかりません。 正しい配列ができてるならそのようになるはずがないですし、そもそも質問者さんがどういう画面を見てそのように仰っているのかわかってません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問