• ベストアンサー

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のみで表を作成できるのではないかと思っています。 まあでもエラーが出ますので、私の考えに大きな誤りがあるわけですが、誤っている部分をご指摘ください。 よろしくお願いいたします。

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

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

  • ベストアンサー
回答No.3

## ●・・ここで<tr>を持ってくる必然性がわかりません。 ## 例えば print "<td>{$value}</td>"のコードの<td>の横に付けることでも可能ではないのしょうか? テーブルヘッド部の定義で<tr></tr>内に3要素(都市名,最高気温,最低気温)を定義してます。 <tr></tr>の整合性を保って<td>を表示している部分に<tr>を持ってくるとコードは print "<tr><td>{$value}</td></tr>" ※ この場合、必然性がわからないとお書きに成っている<tr>の行を削除する事となり、結果として例えば最初の定義の array("東京",32,25),が都市名1≫東京 都市名2≫32 都市名3≫25 と展開されます。 都市名を展開するforeachの前後で<tr></tr>を出力する事で <tr> 都市データ定義の展開 </tr>という手順で展開しています。 この結果、3回(1都市分のarray定義の展開)のprint "<td>{$value}</td>"実行で、<td>東京</td> <td>32</td> <td>25</td>が出力されます。 この結果、foreachの前後で出力している<tr></tr>と合わせると、一都市分の <tr><td>東京</td> <td>32</td> <td>25</td></tr> という出力が得られる事になります。 ## $cityの中にはarray("東京",32,25) array("名古屋",28,21), array("大阪",27,20),array("京都",26,19),array("福岡",27,22), が格納されているので、別にこれをネストして{$value}に格納しなくてもそのまま変数$cityのみで表を作成できるのではないかと思っています。 下記ページでPHP print文の説明が読めます。printで出力できるデータ型は文字列です。$cityはarrayですから直接printで出力する事はできません。 http://www.php.net/manual/ja/function.print.php 最初の回答者がforeachを使わずに展開する方法を記されていました[<td>$city[1]</td>...]のでそちらもご参照ください。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>print "<td>{$value}</td>"のコードの<td>の横に付けることでも可能ではないのしょうか? そうすると、 <tr>:foreachの中 </tr>:foreachの外 となり、<tr>と</tr>のペア状態がくずれます。

noname#227352
noname#227352
回答No.1

<?php //コレだと$cityは、配列!Arrayが出力される foreach($data as $city){ print "<tr><td>".$city."</td></tr>"; } >例えば print "<td>{$value}</td>"のコードの<td>の横に付けることでも可能ではないのしょうか? //配列の中の変数の数が固定なら、下記でもOK! foreach($data as $city){ print "<tr><td>$city[0]</td><td>$city[1]</td><td>$city[2]</td></tr>"; } //配列の中の変数が増減しても構わないようにするなら、下記の方がベター! <table> <?php foreach($data as $city){ print "<tr>"; foreach($city as $value){ print "<td>{$value}</td>"; } print "</tr>"; } ?> </table>

関連するQ&A

  • 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)とどのような関係で処理されていっているのか教えていただけませんでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • 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
  • PHPコードの読解お願いいたします

    PHP初心者です。 環境→XAMPP1.7.0でアパッチなど一括ダウンロード OSはヴィスタ 以下コード中分からない点がありますので、ご指導よろしくお願いいたします。(細かい点は省略しています) なお●の部分が分からない点です。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <?php $city=array("東京""大阪""名古屋""神奈川") ?> <h2>出発地のご案内</h2> <form> <select name="city"> <?php foreach($city as $name=>$value){  ● print "<option value={$value}>{$value}</option> } ?> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ●・・foreach内の$nameと$valueの変数はそれぞれ何を表わしているのでしょうか。 私の教科書的理解で申しますと、$nameはキー用の変数を表わし、$valueは値用の変数を表すものだと思っております。 そこから考えると、$cityに格納されている”東京"、"大阪"、"名古屋"、"神奈川”それぞれの文字列はキー用の$nameに格納される、なら残った$valueには何が入るのでしょうか。 そもそもforeach($配列名 as $キー用の変数=>$値用の変数)という記載の仕方ができるのは、事前に配列にて 例えば$配列名=array("キー0"=>値0、"キー1"=>値1・・) といった記載がされている場合に有効なのではないかと思うのですが。 繰り返しますが、おそらく$cityに格納されているそれぞれの文字列がキー変数を表わす"$name"に代入されると思うのですが、それでは値用の変数$valueにはいったい何が格納されるといういうのでしょうか。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • 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

    以前に質問させて頂いた内容をもとに、以下のようなものを作成しました。 以前の質問 → http://okwave.jp/qa/q6858703.html 作成したもの ↓ 【Aサーバ】「a.txt」(データ用) $name01='一子'; $age01='11'; $name02='二郎'; $age02='22'; 【Bサーバ】「b.html」(表示用) <?php $data = file_get_contents ('http://www.A/a.txt'); foreach (explode("\n" , $data) as $value) { if (preg_match ("/\\$(.+)='(.+)'/", $value, $matches)) { $$matches[1] = $matches[2]; } } echo '<table>'; echo '<tr><th>'.$name01.'</th><td>'.$age01.'</td></tr>'; echo '<tr><th>'.$name02.'</th><td>'.$age02.'</td></tr>'; echo '</table>'; ?> ここで質問なのですが、↑のような仕組みで、a.txtの中身が $name03='三太'; $age03='33'; $name04='~~'; $age04='~~'; と増えていった場合、b.htmlの echo '<tr><th>'.$name~~.'</th><td>'.$age~~.'</td></tr>'; が自動的に増えてくれるようなものを作りたいと考えています。 配列(?)を使うという方法も調べてみたのですが、分からず……。 ご教示願います。

    • ベストアンサー
    • 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言語にて

    <?php print "<form><table border=\"1\" cellpadding=\"5\">\n"; for($i=0;$i<6;$i++){ if($i==0){print "<tr><td>&nbsp;</td><th>月曜日</th><th>火曜日</th><th>水曜日</th><th>木曜日</th><th>金曜日</th></tr>\n"; continue; } print "<tr><td align=\"center\">$i<br>限</td>"; for($j=1;$j<6;$j++){ print "<td><select name=\"kamoku$j$i\"><option value=\"\"> <option value=\"科目A\">科目 A<option value=\"科目B\">科目 B<option value=\"科目C\">科目 C<option value=\"科目D\">科目 D<option value=\"科目E\">科目 E<option value=\"科目F\">科目 F<option value=\"未定\">未定 </select> </td>"; } print "</tr>\n"; } print "</table>\n</form>"; ?> これにボタンを付けて、ボタンを押したら操作をできなくするにはどうすればいいですか? 保存のような機能を付けたいのですが… なにか参考になるサイトはありませんか?

    • 締切済み
    • 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
  • phpのリンクについて

    <?php print "<form><table border=\"1\" cellpadding=\"5\">\n"; for($i=0;$i<6;$i++){ if($i==0){print "<tr><td>&nbsp;</td><th>月曜日</th><th>火曜日</th><th>水曜日</th><th>木曜日</th><th>金曜日</th></tr>\n"; continue; } print "<tr><td align=\"center\">$i<br>限</td>"; for($j=1;$j<6;$j++){ print "<td><select name=\"kamoku$j$i\"><option value=\"\"> <option value=\"科目A\">科目 A<option value=\"科目B\">科目 B<option value=\"科目C\">科目 C<option value=\"科目D\">科目 D<option value=\"科目E\">科目 E<option value=\"科目F\">科目 F<option value=\"未定\">未定 </select> </td>"; } print "</tr>\n"; } print "</table>\n</form>"; ?> (1)プルダウンではなく、リンクを表の中に入れる。 (2)リンク先に教科がいくつかあって、その中から教科を選択する (3)その選択した教科を表に反映させる。 上記のようなことをしたいんですけど、どうすればいいかわかりません。 どうかよろしくお願いします。

    • 締切済み
    • 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