みんなの「教えて(疑問・質問)」にみんなで「答える」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のみで表を作成できるのではないかと思っています。
まあでもエラーが出ますので、私の考えに大きな誤りがあるわけですが、誤っている部分をご指摘ください。

よろしくお願いいたします。

投稿日時 - 2009-04-05 01:32:02

QNo.4853613

困ってます

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

## ●・・ここで<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>...]のでそちらもご参照ください。

投稿日時 - 2009-04-05 10:22:43

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

>print "<td>{$value}</td>"のコードの<td>の横に付けることでも可能ではないのしょうか?

そうすると、
<tr>:foreachの中
</tr>:foreachの外
となり、<tr>と</tr>のペア状態がくずれます。

投稿日時 - 2009-04-05 07:38:45

<?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>

投稿日時 - 2009-04-05 07:01:51

あなたにオススメの質問