🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

6回答

720閲覧

PHP var_dumpで配列を表示したときの読み方

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2019/12/06 02:34

array(1){
[0]=>array(4)
{
["login_id"]=>string(7) "abcdefg"
[0] =>string(7) "abcdefg"
["user_name"]=>string(5) "abcde"
[1] =>string(5) "abcde"
}
}

配列をvar_dumpした時にこのような文が表示されたのですが、表にした時にどのように配置されているのかがイメージできません。教えて頂けると幸いです。

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

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

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

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

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

m.ts10806

2019/12/06 03:10

「表にしたとき」とは?
m.ts10806

2019/12/06 03:11

そもそもその配列はどこから持ってきたものでしょうか。 というか、配列自体の理解がかなり薄いように見受けられます
guest

回答6

0

自分なりに理解することが出来ました。
本当にありがとうございました。
たくさんの方に回答していただき、皆さんにベストアンサーしたいんですが、1つしかできないため、馬鹿の私にも直感的にわかりやすかった方を選ばせて頂きました。
その他の方の回答のコードも参考にして、勉強していきます。
本当にありがとうございました。また質問する際はよろしくお願いします

投稿2019/12/06 04:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

var_dump()などはあくまで配列の内容を確認するために使うものです。

「表」というのが「HTMLのテーブル」のことだとしたら、あくまでそのHTMLを組むための材料のひとつにしかなりません。

配列となっているということはそこからループさせてHTMLを組むことになりますが、やり方を変えてください。

表示させるデータを固定値としてHTMLを先に組んで完成形のイメージを持ってください。「モック」というものです。「プロト」と呼ばれている現場もあります。要は「試作品」ですね。
このモックが基盤となり「どこにどの情報を当て込むか」を決めていきます。そのときに初めてvar_dump()で得られた情報が役に立ちます。

配列のキーを指定すれば値を参照できるので、ループさせながら当て込むと決めた情報を入れて出力するだけです。

ですので、まずモックを作ってください。それが「表にしたときなどのように配置"させるか"」のイメージとなります。

投稿2019/12/06 03:18

m.ts10806

総合スコア80875

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

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

退会済みユーザー

退会済みユーザー

2019/12/06 03:46

回答ありがとうございます。 表にするというのは、ただどのような構造になっているか知りたかっただけです。 なので、特にHTML上に表を記述というのは考えていません。 $list = read_accounts_by_login_id($login_id); DBから特定のデータを抽出しlistに格納 $user_name = $list[0]["user_name"]; user_nameという変数に$list[0]["user_name"];を格納する read_accounts_by_login_idの関数です function read_accounts_by_login_id($login_id); $pdo = db_connect(); // DB操作を行う $sql = "SELECT login_id, user_name FROM accounts" ." WHERE login_id = '{$login_id}'"; $records = $pdo->query($sql); // DBを切断する $pdo = null; $list = array(); while($row = $records->fetch()) { $list[] = $row; } return $list; } $user_name = $list[0]["user_name"]; user_nameという変数に$list[0]["user_name"];を格納する ↑の部分でどこを引っ張っているのかが分からなかったので質問しました。 勉強不足で自分なりに色々調べてますが、どうしようもなかったので、質問しました。 申し訳ありません。
m.ts10806

2019/12/06 05:15

では、別途確認投げましたが「表にしたとき」とはどういう意味で書いてますか? 「される」ではなく「させる」というところが通じてればおそらく考え方は分かってくると思うのですが
m.ts10806

2019/12/06 05:22

何が伝えたいかというと、「配列の出力結果」があって「表」となると通常は「HTMLで表にしたいんだろうな」と伝わります。 ただもとの質問にはDBから取得したことも何も書いてありません。ですから私は追記依頼をしましたが、追記されないので決めうちで回答しました。 「表」があくまで「配列を見やすくした形」で「DBから取得する」のが前提であればコマンドラインなりphpMyAdminなどのツールで見れば基本はその形が入ってくるのでわざわざ考える必要はありません。 要件が不明瞭であるため得たいアドバイスがなかなかついていない+基本不足である指摘が入る とご理解ください。 質問は編集できますので、前提や背景含めてきちんと記述するようにしてください。 どんな熟練者であっても結局書いてある以上のことは汲み取れません。
guest

0

それで分からないなら代わりにvar_exportを使うといいのではないでしょうか?
(こちらなら、PHPの表現になる)

投稿2019/12/06 02:41

yoorwm

総合スコア1305

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

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

退会済みユーザー

退会済みユーザー

2019/12/06 03:02

回答ありがとうございます。 var_exportにて出力してみたんですが、よくわかりませんでした。 array ( 0 => array ( 'login_id' => 'abc', 0 => 'abc', 'user_name' => 'abcd', 1 => 'abcd', ), ) と出ました。 ・0=>arrayの意味が分からない ・なぜlogin_idとuser_nameの他に0=>と1=>があるのか この配列を表に表すことはできないでしょうか。
yoorwm

2019/12/06 03:25

その形式で分からないとなると恐らく「分からない」のではなくて、使い方が分からない、とかそういう所でしょう。 m_ts10806さんが書かれているように「どのように使うか?」という所と合わせて理解するように努めてみるべきかと思います。 (つか、そういうレベルとなると、質問するより先に、真面目に勉強しましょう、というところ。)
m.ts10806

2019/12/06 03:35

「データベースから想定通りの配列がとれた!よしあとはいけるぜ!」となるくらいまでは、まず「配列を組む」「そこから思う通りになるHTMLを組む」の繰り返しですね。 基礎です。
退会済みユーザー

退会済みユーザー

2019/12/06 03:52

勉強不足を痛感しております。理解できるまでそれを繰り返そうと思います。
guest

0

ベストアンサー

コメントではmarkdown記法が使えないので、回答に記述します。

イメージがつかめないんですが、どのような構造になっているんでしょうか?

0 | loginid=>abcd | user_name=>abcdef |
こういう構造なんでしょうか。

Excel風にあらわすとこんな感じかと。

添え字login_iduser_name
0abcdabcdef
1xxxxhoge
2yyyyfuga

上記の番号1と2は勝手にいれました。

PHPの配列イメージを表っぽくすると
イメージ説明

投稿2019/12/06 03:44

XNXSXMXR

総合スコア239

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

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

退会済みユーザー

退会済みユーザー

2019/12/06 03:49

回答ありがとうございます。 $user_name = $list[0]["user_name"]; 例えばこのような文の時に、[0]行目の["user_name"]はuser_nameなのかabcdefなのかが分かりません。 分かりやすく回答していただいてとても感謝しています。 もう少しでわかりそうな気がするので教えて頂けるとありがたいです。
退会済みユーザー

退会済みユーザー

2019/12/06 03:50

$pdo = db_connect(); // DB操作を行う $sql = "SELECT login_id, user_name FROM accounts" ." WHERE login_id = '{$login_id}'"; $records = $pdo->query($sql); // DBを切断する $pdo = null; $list = array(); while($row = $records->fetch()) { $list[] = $row; } return $list; $listの配列はこの文からきています
退会済みユーザー

退会済みユーザー

2019/12/06 03:53

実際出力した際にはabcdefが出力されています。
XNXSXMXR

2019/12/06 04:13 編集

もう解決済みになってましたが、とりあえず記述してた内容を投稿しますね。 配列はよく箱にたとえて説明されるので、箱を使ってみます。 「login_id」という名前の箱と、「user_name」という名前の箱が1セットあるとします。 「login_id」の箱には「abcd」という商品が入っていて、「user_name」という箱には「abcdef」という商品が入っています。 箱の中にある商品が、プログラミングでは「値」と呼ぶものです。 この1セットになった箱は複数用意することができ、それぞれ0番目、1番目・・・など、番号を振っています。 この番号の事を「添え字」と呼びます。 ※連想配列というのもありますが、ここでは省きます。 > $user_name = $list[0]["user_name"]; これの意味は、$listという名前の大きな箱に入っている、0番目の「user_name」という箱の中の商品を、「$user_name」という名前の箱へ入れています。 なので、ここでは「abcdef」が入ります。
guest

0

これは

PHP

1<?PHP 2$rows=[ 3 [ 4 "login_id"=>"abcdefg", 5 0=>"abcdefg", 6 "user_name"=>"abcde", 7 1=>"abcde", 8 ], 9 ]; 10var_dump($rows);

という状態で、おそらくDBからデータを抜き出したんですよね?
ASSOCで抜き出さないと、カラム名とカラムの順番(列番号)で同じデータが抜き出されます

$rows=$stmt->fetchAll(PDO::FETCH_ASSOC);

表作成

もし、$listがfetchAll(PDO::FETCH_ASSOC)で得られたデータならこうしてください

PHP

1<?PHP 2$list=[ 3 [ 4 "login_id"=>"abcdefg", 5 "user_name"=>"abcde", 6 ], 7 ]; 8 9print "<table border>"; 10print "<thead>"; 11print "<tr>"; 12print implode("",array_map(function($x){return "<th>".htmlspecialchars($x)."</th>";},array_keys($list[0]))); 13print "</tr>"; 14print "</thead>"; 15print "<tbody>"; 16foreach($list as $row){ 17print "<tr>"; 18print implode("",array_map(function($x){return "<td>".htmlspecialchars($x)."</td>";},$row)); 19print "</tr>"; 20} 21print "</tbody>"; 22print "</table>";

投稿2019/12/06 03:06

編集2019/12/06 03:31
yambejp

総合スコア116661

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

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

退会済みユーザー

退会済みユーザー

2019/12/06 03:11

回答ありがとうございます。 $pdo = db_connect(); // DB操作を行う $sql = "SELECT login_id, user_name FROM accounts" ." WHERE login_id = '{$login_id}'"; $records = $pdo->query($sql); // DBを切断する $pdo = null; $list = array(); while($row = $records->fetch()) { $list[] = $row; } return $list; このように出しています。
yambejp

2019/12/06 03:14 編集

$records->fetch() のところを $records->fetch(PDO::FETCH_ASSOC) とすれば列番号は表示されなくなりますよ それと、各データを$listにwheleで順番に投入しているようなので これを1行でやるのが $list=$records->fetchAll(PDO::FETCH_ASSOC); です
退会済みユーザー

退会済みユーザー

2019/12/06 03:23

回答ありがとうございます。 無事、列番号は表示されなくなりました。 配列のイメージなんですが、 0 | login_id | user_name | 1 | abcd | abcdef | というイメージだと思っているんですが、違いますか?
yambejp

2019/12/06 03:26

違いますね
退会済みユーザー

退会済みユーザー

2019/12/06 03:27

イメージがつかめないんですが、どのような構造になっているんでしょうか? 0 | loginid=>abcd | user_name=>abcdef | こういう構造なんでしょうか。
yambejp

2019/12/06 03:32

追記してあります
guest

0

var_dump()の出力は、データ型やサイズも伴ったもので情報量が多いですね。
構造がわかりにくいというのであれば、
var_export()を使えば、
phpでの文法通り出力されるので、ある意味わかりやすくなります。


0=>arrayの意味が分からない

配列の値として、配列を持っている状態です。
つまり、配列の、配列。
(二次元配列ではありません、あくまで、配列を抱える配列です。)

なぜlogin_idとuser_nameの他に0=>と1=>があるのか

fetchAll()でデータ取得したのかなと察しますが、
説明上、仮に$rows = $stmt->fetchAll();などとしたものとすると、
$rows[0]$rows[1]などでレコード単位(行単位)のデータにアクセスでき、
その行が持つデータにアクセスするために
$rows[0]['login_id']$rows[0]['user_name']で、
あるいは$rows[0][0]$rows[0][1]でレコード内のカラムにアクセスできる構造です。
クエリー実行したときのSELECT文の書き方次第です。

他の方の回答にあるように、カラム名称でも、0から始まる数値でも、
カラムごとのデータにアクセスできるようになっていますので、
お好きな方法をお使いください。


PHPでデータベースに接続するときのまとめ - Qiita
を参考に全容を書き出すと、

php

1try { 2 3 /* リクエストから得たスーパーグローバル変数をチェックするなどの処理 */ 4 5 // データベースに接続 6 $pdo = new PDO( 7 'mysql:dbname=testdb;host=localhost;charset=utf8mb4', 8 'root', 9 '', 10 [ 11 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 12 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 13 ] 14 ); 15 16 /* データベースから値を取ってきたり, データを挿入したりする処理 */ 17 $stmt = $pdo->prepare('SELECT login_id, user_name FROM accounts WHERE login_id = :id'); 18 $stmt->bindValue(':id', $login_id, PDO::PARAM_INT); 19 $stmt->execute(); 20 21 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 22 /* 行ごとに取得したデータを出力する。表組みしたければtr,th,td要素を駆使すること。 */ 23 echo $row['login_id'] . PHP_EOL; 24 echo htmlspecialchars($row['user_name'], ENT_QUOTES, 'UTF-8') . PHP_EOL; 25 } 26 27} catch (PDOException $e) { 28 29 // エラーが発生した場合は「500 Internal Server Error」でテキストとして表示して終了する 30 // - もし手抜きしたくない場合は普通にHTMLの表示を継続する 31 // - ここではエラー内容を表示しているが, 実際の商用環境ではログファイルに記録して, Webブラウザには出さないほうが望ましい 32 header('Content-Type: text/plain; charset=UTF-8', true, 500); 33 exit($e->getMessage()); 34 35}

あくまで机上のコードなので、エラー出たらごめんね。
prepareしてbindValueしてexecuteしてから、
例えば行単位で取得するのにfetch()を使う事例のつもり。

投稿2019/12/06 02:40

編集2019/12/06 03:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/12/06 03:02

回答ありがとうございます。 var_exportにて出力してみたんですが、よくわかりませんでした。 array ( 0 => array ( 'login_id' => 'abc', 0 => 'abc', 'user_name' => 'abcd', 1 => 'abcd', ), ) と出ました。 ・0=>arrayの意味が分からない ・なぜlogin_idとuser_nameの他に0=>と1=>があるのか この配列を表に表すことはできないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問