Om dit probleem op te lossen, gebruik ik uiteindelijk een bitmasker om de weekdagen op te slaan.
Ik heb de inhoud van de array voor weekdagen gewijzigd in iets als dit:
$days = [
8, // Wednesday
16, // Thursday
64, // Saturday
];
Gebruik deze lijst als referentie:
1 : Sunday
2 : Monday
4 : Tuesday
8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday
Daarna heb ik een TINYINT
. toegevoegd kolom om het bitmasker voor weekdagen vast te houden. Bij het opslaan van de waarden in de database kan ik eenvoudig het volgende gebruiken:
$valueToMySQL = array_sum($days); // 88, with the sample above
Om te zoeken naar rijen met een specifieke weekdag, bijvoorbeeld zaterdag, kan ik deze voorwaarde gebruiken:
... WHERE `weekdays` & 64;
De weekdagen ophalen uit de database omdat een array iets minder eenvoudig is. Ik gebruik de volgende logica:
$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
if ($bitmask{$i}) {
$days[] = pow(2, $i);
}
}
Als ik alle rijen met dezelfde weekdag als de huidige datum moet ophalen, kan ik de huidige weekdag als volgt doorgeven aan de vorige SQL-voorwaarde:
$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64
Dan:
... WHERE `weekdays` & {$weekdayToMySQL};