• ベストアンサー

PHPの多次元配列について

HTMLでホームページを作れる以外はプログラムに関しほぼ素人です。 環境 XAMPP1.70(最新)にてアパッチなど一括ダウンロード PHP言語にて3×4の表で以下の数値を多次元配列にて作成しようと思っているのですが、当方初心者なもので、 以下のコード(細かい部分は省略しています)、特にforeachがネストになっている部分の処理の流れがいまいちよくわかりません ~~~~~~~~~~~~~~~~~~~~~~~~~ <table border=2> <th>都市名</th> <th>最高気温</th> <th>最低気温</th> <?php  $data=array( array("東京"32,25) array("名古屋",45,67) array("埼玉",32,67) array("大阪",86,34) ) foreach($data as $city){ print "<tr>"; foreach($city as $value){ print "<td>{$value}</td>"    ●1回目foreachからここまでの流れがいまいち分かりません } print "</tr>"; ?> ~~~~~~~~~~~~~~~~~~~~ 一つ目のforeachにて、配列$dataが指定されていますので外側の配列を処理していくと思うのですが、具体的にどういう順番で処理されていくのでしょうか。 またforeach()の中の"$cityが最終的に$valueに格納という形になっていますが、10~13行目のarray("東京",32,25)とどのような関係で処理されていっているのか教えていただけませんでしょうか。 よろしくお願いいたします。

  • --w--
  • お礼率29% (35/117)
  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • coopy72v
  • ベストアンサー率12% (1/8)
回答No.2

希望に沿う回答かわかりませんが… (括弧やコンマなど、ところどころ足りない気がしますが打ち間違えと思ってスルーします) foreach($data as $city){ ↑cityという名前でdataの1項目目から順に取り出し、最後まで繰り返す なので最初は[array("東京"32,25)]←この配列が$cityになる print "<tr>";テーブル1行作成 foreach($city as $value){ ↑valueという名前でcityの1項目目から順に取り出し、最後まで繰り返す なので最初は「東京」。 print "<td>{$value}</td>"「東京」をテーブルの列に追加 「32」→「25」まで表示したらループ抜け } print "</tr>";内ループを抜けたら行を閉じる ↑ここまでの「表1行分の作成」を、10~13行目の各配列に対して行い、data配列がなくなったら終了です } 「そんなこと聞いてない」って感じでしたら申し訳ないです

--w--
質問者

お礼

非常に丁寧なご回答ありがとうございました。 なるほどなるほどそういうことだったのですね、分かりやすい解説で完全に理解いたしました。現在独力でPHPを勉強していますが、ちょくちょく質問しておりますので、またご回答願えればと思います。ありがとうございました!

その他の回答 (1)

noname#87667
noname#87667
回答No.1

foreach($data as $city){ /** これを追加して、$dataの中身をチェック */ print_r($city); print "<tr>"; /** ここはfor文で処理 START */ for($i=0;$i<count($city);$i++){ /** いったん変数に代入 */ $value=$city[$i]; print "<td>{$value}</td>"; } /** ここはfor文で処理 END */ print "</tr>"; } 思いつきで書いてしまったので、はずしていたらごめんなさい。

--w--
質問者

お礼

ありがとうございました、こういう書き方もあったのですね。 勉強なります!

関連するQ&A

  • PHPの読解お願いいたします

    PHP初心者です。 環境 XAMPP1.7.0(最新) アパッチなど一括ダウンロード OS:ビスタ 多次元配列について以下のコードについて疑問があります。 ●の部分が疑問点となっております ~~~~~~~~~~~~~~~~~~~~~~~~~~~ <body> <table border="2"> <tr> <th>都市名</th><th>最高気温</th><th>最低気温</th> </tr> <?php $data=array( array("東京",32,25), array("名古屋",28,21), array("大阪",27,20), array("京都",26,19), array("福岡",27,22), ) foreach($data as $city){ print "<tr>"; ● foreach($city as $value) print "<td>{$value}</td>"; ●● } print "</tr>"; ?> </table> </body> </html> ~~~~~~~~~~~~~~~~~~~~~~~~~~ ●・・ここで<tr>を持ってくる必然性がわかりません。 例えば print "<td>{$value}</td>"のコードの<td>の横に付けることでも可能ではないのしょうか? ●●・・foreachがネストになり、多次元配列となっています。 まず$dataを取得しそれぞれを$cityに格納、次のforeachで$cityに格納された1行目のarray("東京",32,25)を一つづつ$valueに格納していくのだとは思いますが、例えばこのforeachネストの一連の流れを以下のように1つのforeachで記載することがなぜエラーになるのか分かりません。 foreac($data as $city){ print "<tr><td>{$city}</td></tr>" } $cityの中にはarray("東京",32,25) array("名古屋",28,21), array("大阪",27,20),array("京都",26,19),array("福岡",27,22), が格納されているので、別にこれをネストして{$value}に格納しなくてもそのまま変数$cityのみで表を作成できるのではないかと思っています。 まあでもエラーが出ますので、私の考えに大きな誤りがあるわけですが、誤っている部分をご指摘ください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 【PHP】smartyとPHPの記述違いとメリット

    smartyというのが、デザインとプログラムを分けれるというので 使ってみたのですが、 //--------------------smarty--------------------- <table border=1> <tr> <th>{$table.title}</th> </tr> {foreach item=result from=$data_list} <tr> <td>{$result[0]}</td> </tr> {/foreach} </table> と、smarty用の記述をHTML内にいろいろ書かなければならず //------------------php---------------------- <table border=1> <tr> <th><?=$table[title] ?></th> </tr> <?php foreach($data_list as $key => $value){ ?> <tr> <td><?= $value ?></td> </tr> <?php } ?> </table> とHTML内にPHPをいろいろ書くのと  あまり大差無い気がして どういう点がよいのがイマイチ分かりません。 smartyは 使う メリットは どういうものがあるのでしょうか。

    • ベストアンサー
    • PHP
  • Smarty 三次元配列を使いたい

    最近Smartyを使い始めた者です。 以下のような多次元配列を、$smarty->assign('data', $data); します。 $data = array( [0] => array( [id] => 23 [comment] => 'aaa' [name] = array( [0] => 'xxx' [1] => 'yyy' )) [1] => array( [id] => 24 [comment] => 'bbb' [name] = array( [0] => 'zzz' )) [2] => array( [id] => 25 [comment] => 'ccc' [name] = array( [0] => 'ttt' [1] => 'uuu' )) ) そして、以下のようなテーブルを表示させたいのです。 |-------------------| | 23  | aaaa | xxxx | |    |     |------| |    |     | yyyy | |-------------------| | 24  | bbbb | zzzz | |-------------------| | 25  | cccc | tttt | |    |     |------| |    |     | uuuu | |-------------------| <td>タグのrowspan属性を使おうと思っています。 {foreach}をつかって、以下のようなものを書きましたが、駄目でした。 {foreach from=$data item=value01 name=kiji} <tr> <td rowspan="{$value01.numgoods}">{$value01.id}</td> <td rowspan="{$value01.numgoods}">{$value01.comment}</td> {foreach from=$value01 item=value02 name=goods} {if $smarty.foreach.goods.first} <td>{$value02.name.0]</td></tr> {else} <tr> <td>{$value.name.1}</td> </tr> {/if} {/foreach} {/foreach} エラー表示は、 syntax error: unrecognized tag: $value02.name.0 です 本当は、$value02.name の.0を三次元での要素数分だけ自動でループしてほしいのですが、その書き方がわかりません。 ネットをあさっても、これと言うサイトを見つけれません。 そもそも、三次元目の要素を取得するsmartyの方法がわかりません。 どなたかご教授の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 多次元配列で、foreachを使って、key値を

    多次元配列で、foreachを使って、key値を入れ替えているのですが、 なんで、こうなるか分かりません。  $x = array();  $x[] = array(   "id" => 1,   "name" => "JavaScript",  );  $x[] = array(   "id" => 5,   "name" => "PHP",  );  $z = array();  foreach($x as $key => $value){   $z[$value["id"]] = $value;   }  print_r($z); 配列のKEYをIDに変更しているのですが、 なんで、こうなるのでしょうか? 特に、  $z[$value["id"]] = $value; が分かりません。 例えば、foerachの途中で、var_dumpすると、 1回目だと、 ◆$key 0 ◆$value Array (  [id] => 1  [name] => JavaScript ) ◆$value["id"] 1 まではいいのですが、 ◆$z[$value["id"]] の値が見れません。 ここはどんな処理をやっているのでしょうか?

    • ベストアンサー
    • PHP
  • php配列確認に関して

    $name = array( '0' => 'test', '1' => 'test1', '2' => 'test2', '3' => 'test4', '4' => array( '0' => 'e', '1' => 'r', '2' => 'y', '3' => 'i', ), ); foreach ($name as $key => $value) } print $value; } このうえの配列を確認したいのですが print $value;でやると 4がarrayとなってしまいます 4の中身を確認したいのですか foreachの下に何を書けばいいでしょうか?

    • ベストアンサー
    • PHP
  • PHPで多次元配列を一度に処理するには

    例えば、 array(  [hoge1-1] => hoge1-1_value  [hoge1-2] => array(   [hoge2-1] => hoge2-1_value   [hoge2-2] => hoge2-2_value   [hoge2-3] => array(    [hoge3-1] => hoge3-1_value   )  ) ) のような多次元配列で、すべてのvalueに同じ処理を施すには foreachのなかにforeachを書いて処理するしかないのでしょうか。 もっと単純に、すべてのファイルを一度に処理できるようにする方法は ないでしょうか?

    • ベストアンサー
    • PHP
  • テーブルデータ表示

    mysqlからデータをphpで取得し以下のような多次元配列になっています。 Array ( [0] => Array ( [id] => 116 [name] => あああ ) [1] => Array ( [id] => 58 [name] => いいい ) [2] => Array ( [id] => 89 [name] => ううう ) ) 単純にデータを表示させたく以下のようにしましたが<th>$key2</th>の箇所が上記配列の場合 2回繰り返されて表示されてしまいます。ここはフィールド名なので1回の表示でいいのですが どのように記述すれば思うような表示になるでしょうか? echo "<table border=\"1\">"; echo "<tr>"; foreach ($tmp1 as $key => $val) { foreach ($val as $key2 => $val2) { echo "<th>" . $key2 . "</th>"; //フィールド名 } } echo "</tr>"; foreach ($tmp1 as $key => $val) { echo "<tr>"; foreach ($val as $key2 => $val2) { echo "<td>" . $val2 . "</td>"; // 取得したデータをある分だけ繰り返し } echo "</tr>"; } echo "</table>";

    • ベストアンサー
    • PHP
  • php 多次元配列テーブル

    英語表記 日本語表記 分類 旬  生産量1位 Grapes  ブドウ   果物 8月 山梨県 このような↑多次元配列(foreach)使用でテーブル形式に表せますか? <tr><th>英語表記</th><th>日本語表記</th><th>分類</th><th>旬</th> <th>生産量1位</th></tr> <?php $fruits = array( "Grapes" = "ブドウ","果物","8月","山梨県", ); この先または根本的に違う場合修正お願いいたします。

    • ベストアンサー
    • PHP
  • phpについて質問です。

    php初心者です。 以下のようなコードを書きました。テストの点数を配列に用意し最大値を表示したいのですがうまくいきません。 どなたかご教授お願いします。 <html> <body> <?php $score = array(20, 21, 59, 100, 78); $max = 0; ?> <table border = "2"> <tr bgcolor = aqua> <th>番号</th> <th>点数</th> </tr> <?php for($i=0; $i<count($score); $i++){ if($max < $socre[$i]) $max = $score[$i]; print"<tr>"; print"<td>{$i}</td><td>{$score[$i]}</td>\n"; print"</tr>\n"; } print"</table>\n"; print"</br>\n"; ?> <?php print"最高点は{$max}です。\n"; ?> </body> </html> foreachをつかえばうまくいきました。 for文ではいけないのでしょうか。 最大値が0と表示されるのでどうやらif文の条件分岐がうまくいってないようなのですが..... 初心者なので勘違いをしているところがあると思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列出力をカンマ区切りに変換(PHP)

    DOMを使ってテーブルのスクレイピングをしたいと考えています。 【sample.html】 <table id="rates"> <tr> <th>施設名</th> <th>所在地</th> </tr><tr> <td>大谷地</td> <td>東3丁目3-20</td> </tr><tr> <td>札幌</td> <td>東1丁目1-20</td> </tr></table> 【scre.php】 <?php $entries = []; $dom = new DOMDocument; @$dom->loadHTMLFile('sample.html'); $xpath = new DOMXpath($dom); foreach ($xpath->query('//tr') as $i => $node) { if (!$i) { continue; } $entries[] = [ $xpath->evaluate('string(td[0])', $node), $xpath->evaluate('string(td[1])', $node), ]; } echo "<pre>"; print_r($entries); echo "</pre>"; ?> *************** 結果(出力値) *************** Array ( [0] => Array ( [0] => 大谷地 [1] => 東3丁目3-20 ) [1] => Array ( [0] => 札幌 [1] => 東1丁目1-20 ) 【やりたいこと】 この結果をカンマ区切りとして抽出したいと考えています。 ***************** 希望結果(希望出力値) ***************** 大谷地,東3丁目3-20 札幌,東1丁目1-20 また、このテーブルは別途CSVファイルに落とす予定のため、 echo $data; という形で出力可能なようにしたいと考えています。 初心者的質問で大変恐縮ですが、どうすればいいかご教授いただけましたら幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP