teratail header banner
teratail header banner
質問するログイン新規登録
PHP

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

Q&A

解決済

2回答

607閲覧

PHPの配列について質問です

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2022/06/14 06:34

編集2022/06/14 09:34

0

1

書籍を見ていると初期化した配列の中身は何もない状態にもかかわらず foreach を使うときに foreach ($line as $i => $text) のようにいきなり連想配列のような指定を見ることがあります。私の理解力が足りないので、質問の仕方が間違えているのかもしれませんが、まずこういう書き方は合っているのでしょうか?あと、こういう場合は $text に何が入るのでしょうか?

補足すると、これは数行のテキストが書かれたファイルを読み込んで0行目をタイトルとして表示させ、1行目以降を本文として読み込んで表示するというものなのですが書籍を見ても $text は宣言されていません。

foreach ($line as $i => $text) { if ($i == 0) { echo '<h2>' .$text '</h2>'; } else { $body .= $text . '<br>'; } }

このコードの前には

$fp = fopen("info.text" , "r"); $line = array(); $body = '';

と、ただの array() が用意されているだけです。

何をする処理なのかわかっている私には foreach の内容が「i 行目の $text なんだろうな」とわかるのですが、空の配列に対して途中から連想配列の振る舞いをさせることは当たり前なのでしょうか?そのときの中身や動きが全く理解できません。

妙な質問かもしれませんが、アドバイスよろしくお願いいたします。

追記します。テキストファイルの中身を表示するコードです。

PHP

1<?php 2 $fp = fopen("info.txt", "r"); 3 $line = []; 4 $body = ''; 5 6 if ($fp) { 7 while(!feof($fp)) { 8 $line[] = fgets($fp); 9 } 10 fclose($fp); 11 } 12 ?> 13 14<!doctype html> 15<html lang="ja"> 16 <head> 17 <body> 18 <?php 19 if (count($line) > 0) { 20 foreach ($line as $i => $text) { 21 if ($i == 0) { 22 echo '<h2>' . $text . '</h2>'; 23 } else { 24 $body .= $text . '<br>'; 25 } 26 } 27 } else { 28 $body ='お知らせはありません'; 29 } 30 echo '<p>' . $body . '</p>'; 31 ?> 32 </body> 33 </head> 34</html>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/06/14 06:48

書籍なら、出版社のサイトで正誤表が出ていないかを確認したらいいと思います。
guest

回答2

0

機能確認はPHPマニュアルを。
https://www.php.net/manual/ja/control-structures.foreach.php

書籍を見ても $text は宣言されていません。

引数と同じく、「変数$textに値を入れる」です。
foreachの中身は
(配列変数 as キーの変数名 => 値の変数名)
という形になります。
※(配列変数 as 値の変数名)という形もある。

今回「値の変数名」を$textと名付けただけで、これは別に$aでも$bでも構いません。
「そういう名前の変数名で配列の内部の値を受け取る」だけですから。事前の定義も不要です。
多くのケースではforeachの中でしか使わない一時的な変数です。
※最終値は残ってたりするので、foreachの外で使うときもあるけど、今は考えなくて良い

あとは書籍でどういうコードになってるか知らないですが、
$fpから内容取り出して$lineにおさめるような処理が実はあったりするのでは?

投稿2022/06/14 06:57

m.ts10806

総合スコア80888

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

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

退会済みユーザー

退会済みユーザー

2022/06/14 09:30

>$fpから内容取り出して$lineにおさめるような処理が実はあったりするのでは? はい。$line[] = fgets($fp);という処理がありました。質問をしたことで頭が少し整理されて、何を知りたいのかがわかりました。 最初は$line = [];という、ただの配列だったのですが途中で急にforeach($line as $i => $text)のような連想配列として扱ったことが不思議です。名称の$textに引っかかったわけではなく、配列として初期化されたものを、を途中で連想配列として扱うことは普通なのかどうかが気になりました。 こういう扱い方はよくあることなのでしょうか?キーも値も初期化されていないので、そのときの中身が気になります
guest

0

ベストアンサー

まず

書籍を見ていると初期化した配列の中身は何もない状態にもかかわらず
については

PHP

1var_dump($line); 2 foreach ($line as $i => $text) { 3 if ($i == 0) { 4

とすると、配列の中身は何もない状態では無いことがわかります。

PHP

1 $line[] = fgets($fp);

でファイルの中身を1行ずつ単純配列の新しい要素として格納していますね。

最初は$line = [];という、ただの配列だったのですが途中で急にforeach($line as $i => $text)のような連想配列として扱ったことが不思議です。名称の$textに引っかかったわけではなく、配列として初期化されたものを、を途中で連想配列として扱うことは普通なのかどうかが気になりました。

foreachは別に連想配列専用という訳ではなく、単純配列に対して使用することは一般的な用途です。

こういう扱い方はよくあることなのでしょうか?キーも値も初期化されていないので、そのときの中身が気になります

中身については

PHP

1 2 foreach ($line as $i => $text) { 3 if ($i == 0) { 4 var_dump($i); 5 var_dump($text); 6

のような感じで確認してみてください。
$iには単純配列の添え字
$textにはファイルの2行目以降の文字列が1行格納されているはずです。

キーも値も初期化されていないので、
については少し誤解がありそうなので

PHP

1 if ($fp) { 2 while(!feof($fp)) { 3 $line[] = fgets($fp); 4 var_dump($line); 5 } 6 fclose($fp); 7 }

とすると$lineがどの様に変化しているかを把握できるかと思います。


php デバッグ方法
php xdebug 変数確認
等で検索して、処理中の変数の確認方法を知ると処理内容を理解しやすくなるのでお勧めです。

投稿2022/06/14 12:11

編集2022/06/14 12:14
tanat

総合スコア18778

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

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

退会済みユーザー

退会済みユーザー

2022/06/15 05:22

デバッグについて教えていただきありがとうございました。まだモヤモヤしてる部分はありますが var_dump とprint_r を使って変数の中身を確認するという方法を見に付けたいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問