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

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

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

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

Q&A

解決済

2回答

1908閲覧

2ずつ増える現象

toutou

総合スコア2050

PHP

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

0グッド

0クリップ

投稿2016/09/14 05:44

編集2016/09/14 05:57

phpで簡単なカレンダーを作成する方法を見てサンプルを回してたんですが、なぜか違う動きをします。
おかしい理由はfor文のどこかで余計に+しているということはわかったのですが、出所がわかりません。
変数名を変えたくらいであとは変えてないと思うんですが、何時間かかっても違いがわかりません。
簡単な見落としだと思いますがよろしくお願いします。

間違い図

php

1<?php 2$y=date('Y');//年 3$t=date('n');//月 4//月末日を取得 5$iti=date('j',mktime(0,0,0,$t+1,0,$y)); 6//大本を作成 7$cr=array(); 8$kk=0; 9//月末日までループ 10for($i=1;$i<$iti+1;$i++){ 11//曜日を取得 12 $we=date('w',mktime(0,0,0,$t,$i,$y)); 13//1日の場合 14 if($i==1){ 15//1日の曜日までループ 16 for($s=1;$s<=$we;$s++){ 17 //前半に空文字を 18 $cr[$kk]['day']=''; 19 $kk++; 20 } 21} 22//なぜかここで2ずつ増える。 23var_dump($kk); 24//配列に日付をセット 25$cr[$kk]['day']=$i; 26$kk++; 27 28//月末日の場合 29if($i==$iti){ 30//月末日から残りをループ 31 for($e=1;$e<=6-$we;$e++){ 32//後半に空文字をセット 33 $cr[$kk]['day']=''; 34 $kk++;var_dump($kk); 35} 36} 37 38//配列に日付をセット 39$cr[$kk]['day']=$i; 40$kk++; 41//月末日の場合 42if($i==$iti){ 43 44//月末日からループ 45 for($e=1;$e<=6-$we;$e++){ 46 47//空文字をセット 48 $cr[$kk]['day']=''; 49 $kk++; 50 } 51 } 52} 53?> 54</head> 55<body><br> 56<br><!--ここの数字も違う。--> 57<?php 58var_dump($cr[5]['day']);echo $cr[5]['day']?>

正解図

php

1<?php 2// 現在の年月を取得 3$year = date('Y'); 4$month = date('n'); 5// 月末日を取得 6$last_day = date('j', mktime(0, 0, 0, $month + 1, 0, $year)); 7$calendar = array(); 8$j = 0; 9// 月末日までループ 10for ($i = 1; $i < $last_day + 1; $i++) { 11 // 曜日を取得 12 $week = date('w', mktime(0, 0, 0, $month, $i, $year)); 13 // 1日の場合 14 if ($i == 1) { 15 // 1日目の曜日までをループ 16 for ($s = 1; $s <= $week; $s++) { 17 // 前半に空文字をセット 18 $calendar[$j]['day'] = ''; 19 $j++; 20 } 21 22 } 23 var_dump($j); 24 // 配列に日付をセット 25 $calendar[$j]['day'] = $i; 26 $j++; 27 28 // 月末日の場合 29 if ($i == $last_day) { 30 31 // 月末日から残りをループ 32 for ($e = 1; $e <= 6 - $week; $e++) { 33 34 // 後半に空文字をセット 35 $calendar[$j]['day'] = ''; 36 $j++; 37 38 } 39 40 } 41 42} 43 44?><br><br> 45<?php 46var_dump($calendar[5]['day']);echo $calendar[5]['day']?>

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

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

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

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

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

guest

回答2

0

単純に以下の部分が2回出てくるからでは。

PHP

1//配列に日付をセット 2$cr[$kk]['day']=$i; 3$kk++; 4 5//月末日の場合 6if($i==$iti){ 7//月末日から残りをループ 8 for($e=1;$e<=6-$we;$e++){ 9//後半に空文字をセット 10 $cr[$kk]['day']=''; 11 $kk++;var_dump($kk); 12} 13}

あと、ネストはちゃんとしましょう。
それだけで可読性が全然が違います。

投稿2016/09/14 06:12

ttyp03

総合スコア16996

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

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

ttyp03

2016/09/14 06:13

あ、入れ違いで解決してた。がくり。
toutou

2016/09/14 06:19

ずっと見続けていたので同じ文章に気づかなかったでしょうな。{}が何個も出てくるといまだに混乱します。
guest

0

ベストアンサー

回答というかアドバイスですが、便利なdiffツールがたくさんあるので、比較しながら自分で調べてみたらどうでしょうか!

WimMerge (windowsなら)
Web版diff

※Linuxな方なら、vimdiffとかですかね...

投稿2016/09/14 05:55

編集2016/09/14 05:55
popobot

総合スコア6586

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

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

toutou

2016/09/14 06:07

うわーひどいですわー。これで調べた結果同じ文章を二回書いていたことが発覚。自分のバカさにあきれてものが言えないです。便利なサイトをありがとうございました。この質問消したいですw
popobot

2016/09/14 06:14

プログラミングは長年やっていても、結構凡ミスが多いですよ。しかも凡ミスの原因をみつけるのに長時間かかることもよくあります。結構ご飯食べたり、寝ると一瞬で直ったりもします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問