アプリ版:「スタンプのみでお礼する」機能のリリースについて

●質問の主旨


下記のコードでカレンダーを作りましたが、
日付が横一列に並んだ奇妙なカレンダーになってしまいます。

参考文献と比べて、同じコードを記述しているように思いますが、
なぜ改行されないのか、分かりません。

ご存知の方、アドバイスよろしくお願いします。


●参考文献

西沢直木「プログラミングの教科書」P196


●開発環境

windows8
xammp1.8.1

●コード(test.4)


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>カレンダー</title>
</head>
<table border="1">

<tr>
<th>日</th>
<th>月</th>
<th>火</th>
<th>水</th>
<th>木</th>
<th>金</th>
<th>土</th>
</tr>
<tr>

<?php
$y =2012;
$m = 2;

$wd1 = date("w", mktime(0, 0, 0, $m, 1, $y));
for ($i = 1; $i <= $wd1; $i++) {
echo "<td> </td>";
}

$d = 1;
while (checkdate($m, $d, $y)) {
echo "<td>$d</td>";

if (date("w", mktime(0, 0, 0, $m, $d, $y)) == 6) {
//週を終了
echo"</tr>";

//次の週がある場合は新たな行を準備
if (checkdate($m, $d + 1, $y)) {
echo"<tr>";
}
}
//日付を1つすすめる
$d++;
}

// 最後の週の土曜日まで移動
$wdx = date("w", mktime(0, 0, 0, $m + 1, 0, $y));
for ($i = 1; $i < 7 - $wdx; $i++) {
echo "<td> </td>";
}
?>
</tr>
</table>

「改行されないカレンダー(PHP)」の質問画像

A 回答 (5件)

>>3の補足に対しての追記になります。



> 一度目は、「560123456012345601234560123」と表示されました。

それは、「2013年」2月のカレンダーではないですか?
日数が28日しかなく、金曜日から始まってる月は ここ最近では 今年のものかと思います。
まぁ、本題とは関係ないので 正直 それほど気にすることでもないのですけど。

> Notice: Undefined variable: hoge

これは、俺の説明不足です。

一番 最初の行に ↓を追加すると ↑コレは出なくなるはずです。

<?php $hoge = ""; ?>
    • good
    • 0
この回答へのお礼

bm_hiroさま
たびたびのご回答ありがとうございます。

<?php $hoge = ""; ?>

を最初に入力したら、
Notice: Undefined variable: hoge
は、出なくなりました。

いろいろとアドバイス助かります。

お礼日時:2013/05/09 15:39

なんとなく気になったので、一応追記。



>>3の回答の<tr>の話に関しては PHP部分の事であり、その他のHTML部分に関しては、その限りではありません。

ついでに、もう一つ。
正常に表示する環境でも、↓の「6」を「7」という、通常ありえない数字にすると簡単に現象が再現できます。

if (date("w", mktime(0, 0, 0, $m, $d, $y)) == 6) {
    • good
    • 0
この回答へのお礼

bm_hiroさま
追記ありがとうございます。
こちらも参考にさせていただきます。

お礼日時:2013/05/08 15:10

『現象には必ず理由がある』


「ガリレオ」絶賛放送中。は、置いといて。

どうやれば、この現象が発生するのか確認してみました。

chrome , Firefox , IE9で確認。

実は「<TR>の開始タグ、終了タグ どっちか」があれば、ちゃんと改行されて表として表示されました。

なので、「両方 存在していない時」のみ 提示した画像のような画面になります。

となると、そちらの環境では、↓の行が 正常に動いていないと考えられます。

> if (date("w", mktime(0, 0, 0, $m, $d, $y)) == 6) {

その結果、「<TR>の開始タグ、終了タグのどちらも出力されず、横一列に表示されている」と思われます。

↑↑の行の手前に ↓ 追加して、

$hoge .= date("w", mktime(0, 0, 0, $m, $d, $y));

一番最後の行に ↓を追加し、出力してみて、

<?php print $hoge; ?>

ちゃんと、「34560123456012345601234560123」と表示されるか確認してみてください。

もし、ちゃんと↑このように表示されるとしたら、他の理由を考えなきゃいけません。

もし、↑↑のように表示されないとしたら、どのように表示されるか補足お願いします。

この回答への補足

ただし、bm_hiroさまのご回答を見て
一度目は、「560123456012345601234560123」と表示されました。
何でだろう?と、コードを何回かいじっているうちに、

下記のお礼で申し上げた事象になりました。

補足日時:2013/05/08 15:09
    • good
    • 0
この回答へのお礼

bm_hiroさま
ご回答ありがとうございます。

No.1さまへのお礼の通り、
どういうわけだか、知らないうちに
解決してしまいました。

〉↑↑の行の手前に ↓ 追加して、

$hoge .= date("w", mktime(0, 0, 0, $m, $d, $y));

〉一番最後の行に ↓を追加し、出力してみて、

<?php print $hoge; ?>

を行うと、表示は改行されたカレンダー表示の上に
メッセージが出力されます。

Notice: Undefined variable: hoge in C:\xampp\htdocs\php1st\test4.php on line 54

「34560123456012345601234560123」は
表示されません。

お礼日時:2013/05/08 15:05

ソースをコピペする限り普通に表示されますね



改行されないという状態のブラウザから、
「ソースを表示」で<tr>・・・</tr>がきちんと吐き出されているか
かくにんしてみてはいかがでしょうか?
    • good
    • 0
この回答へのお礼

yambejpさま
ご回答ありがとうございます。

No.1さまへのお礼の通り、
どういうわけだか、知らないうちに
解決してしまいました。

そのとき吐き出されたコードは
以下のようになります。

●吐き出されたコード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>カレンダー</title>
</head>
<table border="1">

<tr>
<th>日</th>
<th>月</th>
<th>火</th>
<th>水</th>
<th>木</th>
<th>金</th>
<th>土</th>
</tr>
<tr>

<td> </td><td> </td><td> </td><td> </td><td> </td><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td></tr><tr><td>10</td><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td></tr><tr><td>17</td><td>18</td><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td></tr><tr><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td> </td><td> </td></tr>
</table>

お礼日時:2013/05/08 14:59

ソースを見る限り問題ないですし、実際に試してみても正しく<tr>...</tr>で表組みされたものが出ますね…。


ブラウザ依存の可能性もありますが、別なブラウザ(ChromeとかFirefoxとか)で表示してみても同じ現象になるでしょうか?
    • good
    • 0
この回答へのお礼

pa_cottaさま
ご回答ありがというございます。

今日になって確認してみたら、
どういうわけだか、正常に表示されます。

ふだんはChromeを使っています。

設定→ネットワーク→プロキシ設定の変更
→LANの設定→プロキシサーバー

について、よくオンオフを繰り返すので、
何かの拍子で、正しく<tr>...</tr>の
表示ができるようになったのかもしれません。

お礼日時:2013/05/08 14:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!