この問題を解決するために、私は最終的にビットマスクを使用して平日を保存します。
平日の配列の内容を次のように変更しました:
$days = [
8, // Wednesday
16, // Thursday
64, // Saturday
];
このリストを参照として使用する:
1 : Sunday
2 : Monday
4 : Tuesday
8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday
次に、TINYINT
を追加しました 平日のビットマスクを保持する列。データベースに値を保存するとき、私は単に以下を使用することができます:
$valueToMySQL = array_sum($days); // 88, with the sample above
特定の平日、たとえば土曜日の行を検索するには、次の条件を使用できます。
... WHERE `weekdays` & 64;
配列としてデータベースから平日を取得するのは少し簡単ではありません。次のロジックを使用しています:
$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
if ($bitmask{$i}) {
$days[] = pow(2, $i);
}
}
現在の日付と同じ曜日のすべての行を取得する必要がある場合は、次のように現在の曜日を前のSQL条件に渡すことができます。
$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64
次に:
... WHERE `weekdays` & {$weekdayToMySQL};