ラック
Home > ブログ > 記事 > 2018年10月 > PHP: 曜日を入力すると、今月の該当する曜日の日付を配列で返す

PHP: 曜日を入力すると、今月の該当する曜日の日付を配列で返す

カテゴリ: プログラム

タイトルだけではイマイチやりたいことが伝わるか自信がないです……。

やりたいこととしては、「年」「月」「曜日(複数指定可)」を引数に渡すと、該当する曜日の数字を配列で返してくれる、ということです。

例えば「2018年」「10月」の「月曜」ならば、「1,8,15,22,29」という5つの要素の配列を返してくれる、という具合です(複数日指定の場合ソートはしないものとする)。

ライブラリがあれば簡単なのですが、少しググった感じでは見当たらなかったので下記のようなコードを書いて解決させました。

<?php
//曜日から日付を指定
function week2Date($thisYear, $thisMonth, $weekArray) {
    $firstDayWeek = (int)date('w', strtotime($thisYear . '/' . $thisMonth . '/01 00:00:00')); //今月の月初の曜日 //0(日)~6(土)
    $lastDay = (int)date('t', strtotime($thisYear . '/' . $thisMonth . '/01 00:00:00')); //今月の日数
    $intArray = arrayStr2Int($weekArray);
    $arrayDate = []; //日付の配列

    foreach($intArray as $thisWeek) { //曜日の配列をループ
        $weekFlag = $thisWeek;
        if($firstDayWeek > $thisWeek) { //指定曜日が月初の日にちの曜日よりも前の場合
            $weekFlag += 7; // 次の週の日付にする
        }
        $firstWeek = $weekFlag - $firstDayWeek + 1; //当月の中で最初に該当する曜日になる日付
        $i = $firstWeek;
        do {
            array_push($arrayDate, $i);
            $i += 7;
        } while($i <= $lastDay); //月末を越えるまで7日ずつ足して配列に追加
    }
    return $arrayDate;
}

//曜日文字列を数字に変換
function weekStr2Int($thisWeek) {
    if($thisWeek === "Mon") {
        return 1;
    }
    else if($thisWeek === "Tue") {
        return 2;
    }
    else if($thisWeek === "Wed") {
        return 3;
    }
    else if($thisWeek === "Thu") {
        return 4;
    }
    else if($thisWeek === "Fri") {
        return 5;
    }
    else if($thisWeek === "Sat") {
        return 6;
    }
    else if($thisWeek === "San") {
        return 0;
    }
}

//曜日文字列の配列から数字の配列を生成
function arrayStr2Int($weekArray) {
    $intArray = [];
    foreach($weekArray as $thisWeek) {
        array_push($intArray, weekStr2Int($thisWeek));
    }
    return $intArray;
}

$resultsArray = week2Date("YYYY", "MM", ["Sun", "Mon"]); //実行
//sample1
//var_dump(week2Date("2018", "10", ["Sun", "Mon"]));
//結果: array(9) { [0]=> int(7) [1]=> int(14) [2]=> int(21) [3]=> int(28) [4]=> int(1) [5]=> int(8) [6]=> int(15) [7]=> int(22) [8]=> int(29) }
//sample2
//var_dump(week2Date("2018", "11", ["Thu"]));
//結果: array(5) { [0]=> int(1) [1]=> int(8) [2]=> int(15) [3]=> int(22) [4]=> int(29) }

タグ: php

 



関連する記事一覧