इस समस्या को हल करने के लिए, मैं सप्ताह के दिनों को स्टोर करने के लिए बिटमास्क का उपयोग करता हूं।
मैंने कार्यदिवसों की सरणी सामग्री को कुछ इस तरह बदल दिया:
$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};