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

こんばんは。お世話になっております。
書籍にあった下記のソースを参考に、1週間単位で表示(および週単位で移動)させたいと考えているのですが、for文などの応用が出来ず、アドバイスを頂戴できればと投函させて頂きました。
お忙しい中恐縮ですが、お力いただけたら幸いです。

描いている表示
<<    >>
日 月 火 水 木 金 土
24 25 26 27 28 29 30

<?php
//感じなところでしょうが文字数制限のため省略。
//フォームにて、西暦、月を取得
//yyyy = $_POST["yyyy"];
//$yyyy = date("Y");
//$mm = date("m");


echo "<table border=\"1\">";
echo "<tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr>";
$wd1 = date("w", mktime(0, 0, 0, $mm, 1, $yyyy));
$d = 0;
$lastd = date("d", mktime(0, 0, 0, $mm + 1, 0, $yyyy));

for ($i = 0; $i <= 5; $i++) {
if ($d >= $lastd) {break;}
echo "<tr>";
for ($j = 0; $j <= 6; $j++) {
$d = $i * 7 + $j - $wd1 + 1;
if ($d > $lastd or $d < 1) {
echo "<td></td>";
}
else {
echo "<td>";
}
echo $d;
echo "</td>";
}
}
echo "</tr>";
}
echo "</table>";

丸投げのようで、すみません。そんなつもりはないのですが・・・要領が掴めず困っております。

A 回答 (3件)

どもですがるです。


まぁ日付けのプログラミングは、一度「日付け」というもの自体について色々と知ったほうがよい、ってのはあるのですが。
今回のケース。ぢつは「ユリウス日」ってのの知識があるとものごっつく「楽」になりますし。

んで、書かれているソースですが。2点ほど。

まず
echo "<a href=\"./sukejuuru.php?d=$w_last\"><</a>";
echo "  ";
echo "<a href=\"./sukejuuru.php?d=$w_next\">></a>";
ですが。これだとNGですね。
年と月も一緒に渡してあげないと、月またぎ年またぎですぐに変な動作しちゃいます。
if($_GET["d"]<>""){
$dd = $_GET["d"];
}
について、月と年でもやってあげるとよいかと思います。

あともう一つは。
$w_last = $dd-7;
$w_next = $dd+7;
の値が、時々31越えたりマイナスに食い込んだりするのですが。
まぁ「年月」渡しておけば計算は出来るのでさほど問題ないです。
ただ、見た目が気になるようなら、

$awk = split("-", date("Y-m-d", mktime(0, 0, 0, $mm, $w_last, $yyyy)));

を使って整理してあげてもよい…かもしれません。

多分もうほんのちょっとだと思いますので。
頑張ってください~ ^^

この回答への補足

galluda様

こんばんは。お世話になっております。
あれから、月・年を渡すためのスクリプトを考えているのですが、前後の月・年はどのように取得したら良いのでしょうか?

お教えいただいた「ユリウス日」も目を通しているのですが、一意性が見出せずに居る次第です。

galluda様にしてみればソースを書き込んだ方が楽かとは思いますが、今一度ヒントとなる考え方などをお教え頂けないでしょうか?

ごゆっくりされているなか(もう大晦日なので)恐縮ですが、引き続きご指導頂けたら幸いです。宜しくお願い致します。

補足日時:2006/12/31 00:59
    • good
    • 0
この回答へのお礼

galluda様

こんばんは。お世話になっております。
ユリウス日ですか・・・とても奥が深そうですね・・。
プログラミングにおいて、思わぬところで1つボキャブラリが増えたような気がします。ちょっと得した気分(笑)。
なんて冗談交じりですが、この貴重なアドバイス。今後のためにも少しずつでも理解を深めていきたく思っております。

と、取り急ぎご挨拶まで。
貴重なヒントを有難う御座いました。追ってご報告を兼ねてご連絡させて頂きます!

お礼日時:2006/12/30 00:57

がるです。


> 翌週への移動など
でヒントをひとつ。

基本的に、whileループの直前のタイミングでの$ddが「スタートの日付」になっています。
つまり「そのタイミングで$ddになにが入っているか」がとても重要になるわけですね。

後は「どんなパラメタを渡すか」になるかと思います。
色々試行錯誤などしてみてください。

この回答への補足

galluda様

あけましておめでとう御座います。
お返事遅れて申し訳ありませんでした。最後に回答いただいた場所は既に空きがなく、こちらからご報告を兼ねたご挨拶をさせて頂きます。

あれから試行錯誤を繰り返し、些か最初の内容とは違ったものではありますが、ようやく描いていたものを作成する事が出来ました。(もちろん100%ではありませんが・・)

これもgalluda様のアドバイスあっての事、感謝しております。有難う御座いました。

補足日時:2007/01/05 22:22
    • good
    • 0
この回答へのお礼

galluda様

こんばんは。あれから試行錯誤を繰り返し、とりあえず下記のようなソースになりました。
今のところ、なんとか正常に動作しておりますが、GETで渡す値に「これで良いのか?」と疑問が残るところもあり、検証しては頂けないでしょうか?・・・今までDBからの検索が主だったため(とは言っても、検索も適切か?は不安があるのですが)、初めてのことが多く、特に日付に関するプログラミングは全く自信がないのです。

お忙しいところお手数お掛けし恐縮ですが、宜しくお願い申し上げます。


$yyyy = date("Y");
$mm = date("m");
$dd = date("d");

$today = $dd;

if($_GET["d"]<>""){
$dd = $_GET["d"];
}
else{
// 指定された日付けを含む週の「日曜日」の日付けを取得
$w = date("w", mktime(0, 0, 0, $mm, $dd, $yyyy));
$dd -= $w;
}

$w_last = $dd-7;
$w_next = $dd+7;

// ここから本当のスタート
echo "<a href=\"./sukejuuru.php?d=$w_last\"><</a>";
echo "  ";
echo "<a href=\"./sukejuuru.php?d=$w_next\">></a>";

echo "<table border=\"1\">";
echo "<tr><td><font color=\"#ff0000\">日</font></td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td><font color=\"#0000ff\">土</font></td></tr>";

echo "<tr>\n";
$i = 0;
while($i++ < 7) {
// 年月日を取得:本当は関数とかクラスのほうがベター
$awk = split("-", date("Y-m-d", mktime(0, 0, 0, $mm, $dd, $yyyy)));
// 表示
if($awk[1]==$mm AND $awk[2]==$today){//現在日時を太文字で表示するため
echo "<td><b>".$awk[1]."/".$awk[2]."</b></td>\n";
}
else{
echo "<td>".$awk[1]."/".$awk[2]."</td>\n";
}
// 日付けを一つ繰り上げる
$dd ++;
}
echo "</tr>\n";
echo "</table>\n";
?>

お礼日時:2006/12/29 21:58

がると申します。


んと………ちと説明が長くなりそうなので。珍しく、ソースを貼り付けてみます。
コメントとかから、挙動を少し追いかけてみていただけるとうれしいです。

// ここは実際には適宜パラメタとかから取得してください。
// このデータはテスト用ってことで
$yyyy = 2006;
$mm = 12;
$dd = 28;

// 指定された日付けを含む週の「日曜日」の日付けを取得
$w = date("w", mktime(0, 0, 0, $mm, $dd, $yyyy));
$dd -= $w;

// ここから本当のスタート
echo "<table border=\"1\">";
echo "<tr><td>日</td><td>月</td><td>火< /td><td>水</td><td>木</td><td>金< /td><td>土</td></tr>";

echo "<tr>\n";
$i = 0;
while($i++ < 7) {
// 年月日を取得:本当は関数とかクラスのほうがベター
$awk = split("-", date("Y-m-d", mktime(0, 0, 0, $mm, $dd, $yyyy)));
// 表示
echo " <td>" . $awk[2] . "</td>\n";
// 日付けを一つ繰り上げる
$dd ++;
}
echo "</tr>\n";
echo "</table>\n";

とりあえずこれで「1週間単位で表示」は可能だと思います。

この回答への補足

追加のような質問で恐縮ですが、投函時はあくまで日付だけの表示ではありましたが、日付の表示を「12/29」としたり、または週間表示のはじめに「12月」のように月も含めた表示をした方が良いかと、翌週へのリンク設定も含めて試しているのですが、思うような結果を得られずにおります。

下記ソースは、翌週(前の週)にリンク設定すべく、がる様のソースにそのまま追加記述したものですが、月の表示はともかく、おかしなソースになってはいないか?そもそも月を得るためには日付の増減だけで出来るのか?と思い、ご指摘も含め、改めてご指導頂ければと記載いたしました。
とりあえず、下記ソースで週の前後の移動は出来るのですが、月表示も含め、引き続きアドバイスなど頂けたら幸いです。

if($_GET["d"]<>""){
$w = $_GET["d"];
}
else{
// 指定された日付けを含む週の「日曜日」の日付けを取得
$w = date("w", mktime(0, 0, 0, $mm, $dd, $yyyy));
}
$dd -= $w;

$w_last = $w-7;
$w_next = $w+7;

// ここから本当のスタート
echo $mm;
echo "<br>";
echo "<a href=\"./calendar.php?d=$w_next\"><</a>";
echo "  ";
echo "<a href=\"./calendar.php?d=$w_last\">></a>";

補足日時:2006/12/29 01:51
    • good
    • 0
この回答へのお礼

galluda様

こんばんは。いつもお世話になっております。

>珍しく、ソースを貼り付けてみます。

本当ですね!ご回答してくださった内容を見て、「おー!」って思っちゃいました^^

なんて、冗談交じりの挨拶に恐縮ですが、まずはご挨拶にとお礼をさせて頂きます。
翌週への移動など、課題も残されているので、ご提示してくださったソースを参考に試したいと思います。
追ってご報告を兼ねてご連絡させて頂きます。
早速のご回答をありがとう御座いました。

お礼日時:2006/12/29 01:02

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