За да реша този проблем, в крайна сметка използвам битова маска за съхраняване на делничните дни.
Промених съдържанието на масива от делнични дни на нещо подобно:
$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};