Aby rozwiązać ten problem, używam maski bitowej do przechowywania dni tygodnia.
Zmieniłem zawartość tablicy dni tygodnia na coś takiego:
$days = [
8, // Wednesday
16, // Thursday
64, // Saturday
];
Używając tej listy jako odniesienia:
1 : Sunday
2 : Monday
4 : Tuesday
8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday
Następnie dodałem TINYINT
kolumna do przechowywania maski bitowej dni tygodnia. Podczas przechowywania wartości w bazie danych mogę po prostu użyć następującego:
$valueToMySQL = array_sum($days); // 88, with the sample above
Aby wyszukać wiersze z określonym dniem tygodnia, na przykład sobotą, mogę użyć tego warunku:
... WHERE `weekdays` & 64;
Pobieranie dni tygodnia z bazy danych w postaci tablicy jest trochę mniej proste. Używam następującej logiki:
$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
if ($bitmask{$i}) {
$days[] = pow(2, $i);
}
}
Jeśli muszę pobrać wszystkie wiersze z tym samym dniem tygodnia co bieżąca data, mogę przenieść bieżący dzień tygodnia do poprzedniego warunku SQL w następujący sposób:
$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64
Następnie:
... WHERE `weekdays` & {$weekdayToMySQL};