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

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

ただいまの
回答率

87.60%

カレンダーの日付の色を変えたい

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,893

score 17

$hori=[1,2,3,4,5]
for( $day=1; $day <= $countdate; $day++ ){
/////
}

上記のfor文で表示したカレンダーに
$horiに該当する日付を色を変えたいです。

array_searchを試しましたがうまくいきません。
よろしくお願いいたします。

for( $day=1; $day <= $countdate; $day++ ){
$w = date("w", mktime( 0, 0, 0, $next_month, $day, $now_year ) );

//スタイルシートの値設定ここから-----------------------------------

if ( in_array( $day, (array)$hori, true ) ) {

$style = "color:#C30;";

}

switch( $w ){

case 0: //日曜日の文字色

$style = "color:#C30;";

 break;

case 6: //土曜日の文字色

$style = "color:#03C;";

break;

default: //月~金曜日の文字色

$style = "color:#333;";
                                }


//スタイルシートの値設定ここまで-----------------------------------


$line = $day."日(".$weekday[$w].")"; //1行の定義:日付(曜日)


/スタイルシートを挿入・1行ごとに改行して出力

echo '<tr><td style="'.$style.'">.$line."</td>"

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+2

$hori=[1,2,3,4,5]
for ( $day=1; $day <= $countdate; $day++ ) {
    if ( in_array( $day, $hori, true ) ) {}
} 

【PHP: in_array - Manual】
https://www.php.net/manual/ja/function.in-array.php

【PHPのin_arrayは罠が多いので注意喚起が必要 - Qiita】
https://qiita.com/tadsan/items/2a4c3e6b0b74a408c038#in_arrayに第三引数を渡す

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/08 11:54

    falseでした!!

    キャンセル

  • 2019/04/08 13:46

    追記されたコードの問題は、ifで分岐したとしても必ずその後で$styleが上書きされていることが問題です。

    キャンセル

  • 2019/04/08 13:54

    曜日の定義をしているのでうまくいかないのですね。他の方法で試してみます。

    キャンセル

checkベストアンサー

+1

if ( in_array( $day, $hori, true ) ) {
   $style = "color:#C30;";
}
else { // ←これがないから
   switch( $w ){
...
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/08 14:30

    いけました!!ありがとうございます!!

    キャンセル

+1

PHPはサーバー側の言語なので「色」という認識はありません
HTML上で色を変えるのであればタグ毎にスタイルシートを設定するか
クラスなど適当な属性をつけてCSSで色をつけてください

sample

$hori=[1,2,3,4,5];
$countdate=10;
for( $day=1; $day <= $countdate; $day++ ){
  $style=in_array($day,$hori)?" style=\"color:red\"":"";
  print "<span{$style}>{$day}</span>";
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/08 11:20

    質問の際にcssとつけずに申し訳ありませんでした。

    キャンセル

+1

話の腰を容赦なくバッサリと折らせてもらいます。

phpにおいて日付・時刻を扱う術を身に着けたほうがよろしいかと思います、
その理由は、日付情報をひとまとめにして必要なときに年や月は日や曜日などを抽出したほうが、
何日後や何日前、何週間前、何ヶ月前などの計算も自己流でやることによるミスを防げるからです。

PHP: Date/Time - Manual
DateTimeクラスやDateTimeImmutableクラスを今後もジャンジャン使うことになるかと思いますので
早めに慣れてください。

そして、日本固有の祝日を考慮した休みの日を判定するのに、
japanese-holiday/japanese-holiday - Packagist
【PHP】日本の祝日を扱うときは「Yasumi」を使ってみてはどうですか - Qiita
GitHub - holiday-jp/holiday_jp-php: Japanese holiday.
などいくつかあるようです。お好きなのをどうぞ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/08 11:20

    ありがとうございます

    キャンセル

  • 2019/04/08 11:23 編集

    https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
    ここから辿れる csv ファイル https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv (Shift-JIS 形式)
    を使えば、当年と翌年の祝日設定が自動で可能だったりします。
    (振替休日も休日として登録されています)

    キャンセル

  • 2019/04/08 11:27

    上記を配列に格納して祝日判定を行おうとしていました。ありがとうございます

    キャンセル

+1

「対象の配列に該当の情報が含まれるか」ならin_array()です。

$horiに該当する日付を色を変えたいです。

あとは該当する日付に対してCSSで色指定するだけです。


ただ、もし「$hori」に該当するものが「日本の祝日」なのであれば
japanese-holidayというプラグインが有用です。
※composer必須、あと未来の年の祝日データ更新が年末ですのでcomposer updateの必要あり

会社所定の休日などであればこの限りではありませんが。

追記:
インデントがかなりおかしいのでそこをきちんとキレイにそろえる必要があるのと、提示コードのそのままだと構文エラーもあります。
エラー表示ONにしてますか?(構文チェックを自動で行ってくれるIDE導入を強くすすめます)

構文エラー箇所(あくまで一例):
echo '<tr><td style="'.$style.'">.$line."</td>"
最後に;がないですしクォーテーションの組が抜けてたり合ってなかったり。

というのを一通り回避して提示されてない変数の未定義回避補完もした

<?php
//未定義回避のため勝手に補完したコードstart
$next_month = date('m',strtotime('+1 month'));
$now_year = date('Y');
$countdate = date('t',strtotime('+1 month'));
$weekday = [0=>'日',1=>'月',2=>'火',3=>'水',4=>'木',5=>'金',6=>'土'];
//未定義回避のため勝手に補完したコードend

$hori = [1, 2, 3, 4, 5];
for ($day = 1; $day <= $countdate; $day++)
{
    $w = date("w", mktime(0, 0, 0, $next_month, $day, $now_year));

    // スタイルシートの値設定ここから-----------------------------------

    if (in_array($day, (array)$hori, true))
    {
        $style = "color:#C30;";
    }

    switch ($w)
    {
        case 0: //日曜日の文字色
            $style = "color:#C30;";
            break;

        case 6: //土曜日の文字色
            $style = "color:#03C;";
            break;

        default: //月~金曜日の文字色
            $style = "color:#333;";
    }

    // スタイルシートの値設定ここまで-----------------------------------

    $line = $day."日(" . $weekday[$w] . ")";
    echo '<td style="'. $style .'">'.$line.'</td>'.PHP_EOL;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/08 12:55

    変数提示の漏れや構文エラーよりもインデントのほうが気になります(エンジニアの職業病ですね・・)

    キャンセル

  • 2019/04/08 13:50

    インデント直します・・・ありがとうございます!

    キャンセル

  • 2019/04/08 13:54

    質問を提示するコードを直すのではなく必ずご自身の手元のコードを治してご提示くださいね。
    普段のコーディングから意識するのはもちろんですが構文チェック+フォーマット機能のあるエディタ利用するのが確実です。

    キャンセル

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

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る