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

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

新規登録して質問してみよう
ただいま回答率
85.48%
foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

多次元配列

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

PHP

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

Q&A

解決済

4回答

1499閲覧

PHP foreach 連想配列 の要素の取り出しについて

Koyo12

総合スコア3

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

多次元配列

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

PHP

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

0グッド

0クリップ

投稿2021/08/02 17:21

編集2021/08/03 03:36

php初学者です。
foreachを勉強しているのですが、下記のコードの'本田' '香川'というワードを取り出すことができません。

php

1 2<?php 3 4$members = [ 5 '本田' => [ 6 'height' => 170, 7 'hobby' => 'サッカー' 8 ], 9 '香川' => [ 10 'height' => 165, 11 'hobby' => 'サッカー' 12 ] 13]; 14foreach($members as $member){ 15 foreach($member as $key => $value) 16 echo $member.'は' . $key . 'は' . $value . 'です。'; 17} 18 19 20 ?> 21

echo $member.'は' . $key . 'は' . $value . 'です。';

こちらのコードで実行すると$memberがArrayとなっており、展開されていない?からArrayとなっていると思うのですが、展開はしない?(こんな言い方でいいのかな?)で本田と香川という文字を取り出して

実行結果が
本田のheightは170、hobbyはサッカー。
香川のheightは165、hobbyはサッカー。
と出力させたいです。
どのようなやり方で取り出せばよろしいのでしょうか。

こちらはこのコードで実行した時の画面です
イメージ説明

少しだけ話がそれますが、個人的には二回目のforeachの中に$memberを書いてしまうと

本田のheightは170、本田のhobbyはサッカー。

となってしまい、本田という文字が二回なってしまうのではないかと考えましたが、
本田のheightは170、hobbyはサッカー。
と言った上記の実行結果にするにはどうすればいいかわからないです。
質問に慣れていないので読みにくいところがあったらすいません
ご教授いただけると幸いです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/02 19:12

まず、質問には発生しているエラーを書きましょう。 回答は書きますが、質問を修正しておいてください。
Koyo12

2021/08/03 03:34

わかりました!ご指摘ありがとうございます!
guest

回答4

0

デバッグ環境を整えると、変数の変化を確認でき学習効果が上がるのでオススメです。

本件ですが、表示に必要な名前を、最初の foreach で取り出していないので意図した結果が出ていません。
先にコードを書きます。

php

1<?php 2$members = [ 3 '本田' => [ 4 'height' => 170, 5 'hobby' => 'サッカー' 6 ], 7 '香川' => [ 8 'height' => 165, 9 'hobby' => 'サッカー' 10 ] 11]; 12foreach($members as $name => $member){ 13 foreach($member as $key => $value) 14 echo $name.'は' . $key . 'は' . $value . 'です。'; 15// echo "hogehoge"; 16} 17?>
本田はheightは170です。本田はhobbyはサッカーです。香川はheightは165です。香川はhobbyはサッカーです。

ただ、この書き方は非常に危ういです。
途中のコメントを外してみてください。

本田はheightは170です。本田はhobbyはサッカーです。hogehoge香川はheightは165です。香川はhobbyはサッカーです。hogehoge

上記となり、hogehogeが2回しか出てきません。

これは

php

1 foreach($member as $key => $value) 2 echo $name.'は' . $key . 'は' . $value . 'です。'; 3 echo "hogehoge";

php

1 foreach($member as $key => $value)echo $name.'は' . $key . 'は' . $value . 'です。'; 2 echo "hogehoge";

と解釈され、もう少し丁寧に書くと

php

1 foreach($member as $key => $value){ 2 echo $name.'は' . $key . 'は' . $value . 'です。'; 3 } 4 echo "hogehoge";

と同じ動作をしているからです。

非常に見つけにくい問題個所になる可能性があるので、気を付けた方が良いです。

余談)

本田のheightは170、hobbyはサッカー。

の出力は

本田の heightは170 、 hobbyはサッカー 。

のような感じで複数個所で出力をすると良いのですが、の出し分けが初学者には難しい気がします。

投稿2021/08/02 19:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Koyo12

2021/08/03 03:29 編集

わざわざ発生しているエラーを書きましょう。とご指摘いただきありがとうございます。次から書くようにしてみます。 "hogehoge"が2回出力されるのは理解できたのですが、なぜforeachの下に書いているのに2回しか出力されず、4回出力されないのか詳しく教えてくれると幸いです!また、"hogehoge"を4回出力させるにはどのようなコードを書けばいいかご教授いただけると幸いです。お手数おかけして大変申し訳ございません
退会済みユーザー

退会済みユーザー

2021/08/03 09:47

回答に追記しようとしたところ投稿できなかったので、追加回答しました。 確認してみてください。
guest

0

ベストアンサー

文字数制限で元の回答に追記が書けなかったので、回答を分けました。

追記

まず、エラーに関してですが、質問のコードを実施すると、

PHP Warning: Array to string conversion in /workspace/Main.php on line 15

のような Warning が発生します。上記が表示されてないようなので、学習中はエラーを表示する設定にしておくのが良いです。調べてみてください。
*もしレンタルサーバ上で学習しているのであれば、レンタルサーバの学習用途の利用はやめた方が良いです。セキュリティ観点で危険です。

次に、コメントにあったhogehogeが2回しか表示されない件ですが、以下を確認すると良いです。
PHP マニュアル 言語リファレンス 制御構造 はじめに
PHP マニュアル 言語リファレンス 制御構造 if

制御構造の仕組みを if の説明に中に書くなよって感じですが、雑にまとめると

php の制御構造では、対象とする構文の直後にある文を(構文が式を使用するのであれば、その式が真の時)実施します。その際、文は中括弧でグループ化することが可能です。

ってことなんですが、逆に言うと中括弧が無ければ、単体の文のみ実施されます。
つまり、次のセミコロンまでが制御構造で実施される範囲となります。

if ではそこそこ見かける記法なのですが、foreach ではあまり見ません。
意図しない挙動を引き起こした際に見つけ出すのが困難な記述なので、なるべく中括弧を記述した方が良いです。

投稿2021/08/03 09:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Koyo12

2021/08/03 17:37

丁寧に質問に答えていただきありがとうございます。 おかげでかなり理解を深めることができて理解が深まりました! 現在はMAMPを使って学習をしています!MAMPを使って学習をする以外に 他の学習環境のおすすめがあれば教えてくださると幸いです!
退会済みユーザー

退会済みユーザー

2021/08/03 22:09

MAMP って、エラー表示を抑止してるみたいですね。。。 エラー表示方法はググれば出てきます。 チョットしたスクリプトとなら以下も使えます。 https://paiza.io/ja/projects/new ただ、MAMP の方が便利だと思うけど。
Koyo12

2021/08/04 09:23

MAMPでエラー表示を出すことができました!ありがとうございます
guest

0

PHP

1$members = [ 2 '本田' => [ 3 'height' => 170, 4 'hobby' => 'サッカー', 5 'name' => '圭佑' 6 ], 7 '香川' => [ 8 'height' => 165, 9 'hobby' => 'サッカー', 10 'name'=>'真司' 11 ] 12]; 13foreach($members as $member=>$info){ 14 $ret=""; 15 foreach($info as $key => $value){ 16 $ret.= ($ret==""?$member.'は':"、") . $key . 'は' . $value ; 17 if(end($info)==$value) $ret.='です。'; 18 } 19 echo $ret; 20}

投稿2021/08/03 00:25

yambejp

総合スコア114835

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

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

0

個人的に、配列の添え字に英数字以外を使うのはなんか気持ち悪いので
自分だったら、まず形を変えますね。

php

1$members = [ 2 '本田' => [ 3 'height' => 170, 4 'hobby' => 'サッカー' 5 ], 6 '香川' => [ 7 'height' => 165, 8 'hobby' => 'サッカー' 9 ] 10]; 11 12$work = []; 13foreach ($members as $k=>$ar) { 14 $ar['name'] = $k; 15 $work[] = $ar; 16} 17 18var_dump($work);

投稿2021/08/02 21:33

takasima20

総合スコア7458

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問