Pour résoudre ce problème, je finis par utiliser un masque de bits pour stocker les jours de la semaine.
J'ai changé le contenu du tableau des jours de la semaine en quelque chose comme ceci :
$days = [
8, // Wednesday
16, // Thursday
64, // Saturday
];
En utilisant cette liste comme référence :
1 : Sunday
2 : Monday
4 : Tuesday
8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday
Ensuite, j'ai ajouté un TINYINT
colonne pour contenir le masque de bits des jours de la semaine. Lors du stockage des valeurs dans la base de données, je peux simplement utiliser ce qui suit :
$valueToMySQL = array_sum($days); // 88, with the sample above
Pour rechercher des lignes avec un jour de semaine spécifique, samedi par exemple, je peux utiliser cette condition :
... WHERE `weekdays` & 64;
Récupérer les jours de la semaine à partir de la base de données sous forme de tableau est un peu moins simple. J'utilise la logique suivante :
$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
if ($bitmask{$i}) {
$days[] = pow(2, $i);
}
}
Si j'ai besoin de récupérer toutes les lignes avec le même jour de la semaine que la date actuelle, je peux passer le jour de la semaine actuel à la condition SQL précédente comme suit :
$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64
Ensuite :
... WHERE `weekdays` & {$weekdayToMySQL};