Um dieses Problem zu lösen, verwende ich am Ende eine Bitmaske, um die Wochentage zu speichern.
Ich habe den Inhalt des Wochentags-Arrays so geändert:
$days = [
8, // Wednesday
16, // Thursday
64, // Saturday
];
Verwenden Sie diese Liste als Referenz:
1 : Sunday
2 : Monday
4 : Tuesday
8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday
Dann fügte ich ein TINYINT
hinzu Spalte, um die Bitmaske der Wochentage aufzunehmen. Beim Speichern der Werte in der Datenbank kann ich einfach Folgendes verwenden:
$valueToMySQL = array_sum($days); // 88, with the sample above
Um nach Zeilen mit einem bestimmten Wochentag zu suchen, z. B. Samstag, kann ich diese Bedingung verwenden:
... WHERE `weekdays` & 64;
Das Abrufen der Wochentage aus der Datenbank als Array ist etwas weniger einfach. Ich verwende die folgende Logik:
$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
if ($bitmask{$i}) {
$days[] = pow(2, $i);
}
}
Wenn ich alle Zeilen mit demselben Wochentag wie das aktuelle Datum abrufen muss, kann ich den aktuellen Wochentag wie folgt an die vorherige SQL-Bedingung übergeben:
$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64
Dann:
... WHERE `weekdays` & {$weekdayToMySQL};