Para resolver este problema, termino usando una máscara de bits para almacenar los días de la semana.
Cambié el contenido de la matriz de días de la semana a algo como esto:
$days = [
8, // Wednesday
16, // Thursday
64, // Saturday
];
Usando esta lista como referencia:
1 : Sunday
2 : Monday
4 : Tuesday
8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday
Luego agregué un TINYINT
columna para contener la máscara de bits de los días de la semana. Al almacenar los valores en la base de datos, simplemente puedo usar lo siguiente:
$valueToMySQL = array_sum($days); // 88, with the sample above
Para buscar filas con un día de la semana específico, sábado por ejemplo, puedo usar esta condición:
... WHERE `weekdays` & 64;
Recuperar los días de la semana de la base de datos como una matriz es un poco menos simple. Estoy usando la siguiente lógica:
$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
if ($bitmask{$i}) {
$days[] = pow(2, $i);
}
}
Si necesito recuperar todas las filas con el mismo día de la semana que la fecha actual, puedo pasar el día de la semana actual a la condición SQL anterior de la siguiente manera:
$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64
Entonces:
... WHERE `weekdays` & {$weekdayToMySQL};