В моей БД хранится недельная доступность пользователей
Monday Morning - yes
Monday Afternoon - yes
Monday Night - NO
Tuesday Morning - yes
Tuesday Afternoon - yes
Tuesday Night - NO
Wednesday Morning - yes
Wednesday Afternoon - yes
Wednesday Night - NO
etc.
в основном это матрица 7×3, и я пытаюсь найти способ выразить это на языке, как
Майк доступен "MON-WED, Morning thru afternoon"
или что-то подобное …
мой мозг взрывается, чтобы понять лучший способ справиться с этим.
Я использую PHP, но может быть JS или как угодно …
7 возможных комбинаций (от самых специфических до наименее):
Morning, Afternoon, Night
Morning, Afternoon
Morning, Night
Afternoon, Night
Morning
Afternoon
Night
Вы можете идентифицировать комбинации, аналогичные способу идентификации разрешений Unix:
$111 = "Morning - Night";
$110 = "Morning - Afternoon";
$101 = "Morning - Night";
$011 = "Afternoon - Night";
$100 = "Morning";
$010 = "Afternoon";
$001 = "Night";
Ваш следующий шаг — сопоставить дни с их соответствующими значениями в массиве,
считать дни недели целыми числами от 0 до 6 (вс-пн). Доступность воскресенья для бывших должен быть stord с индексом 0, понедельник с 1 и т. д.
Установите цикл, который делает следующее. Для каждого дня начните с пустой строки. Если доступно определенное время, добавьте «1» к строке. Если нет, добавьте «0».
Вот как ваш массив должен выглядеть после цикла
$day[0] = "110";
$day[1] = "110";
$day[2] = "110";
$day[3] = "011";
$day[4] = "011";
$day[5] = "100";
$day[6] = "110";
Теперь это просто вопрос организации элементов $day
с одинаковыми значениями в группы. Сначала отобразите самые большие группы. Один из способов сделать это можно с помощью массива, подобного этому:
$array = []
$array["110"] = "012", "6"$array["011"] = "34"$array["100"] = "5"
Обратите внимание, что 6 не идет после 2, поэтому он вставляется в массив [«110»] как другой элемент, а не добавляется к «012».
Далее упорядочиваем группы по длине:
012 => 110
34 => 011
5 => 100
6 => 110
Теперь перейдите на английский:
Su - Tu: Morning - Night
W - Th: Morning - Night
F: Morning - Night
Sa: Morning - Night
Поскольку это матрица, лучше отображать ее как матрицу, иначе текстовых комбинаций будет слишком много, и пользователям вашего приложения будет трудно это понять.
$s = 'Monday Morning - yes
Monday Afternoon - yes
Monday Night - NO
Tuesday Morning - yes
Tuesday Afternoon - yes
Tuesday Night - NO
Wednesday Morning - yes
Wednesday Afternoon - NO
Wednesday Night - yes';
$a = array();
foreach(explode("\n", $s) as $line) {
$p = explode(' ', trim($line));
if(!isset($a[$p[0]])) {
$a[$p[0]] = array();
}
$a[$p[0]][$p[1]] = $p[count($p) - 1] == 'yes' ? true : false;
}
// the availability matrix
echo '<pre>';print_r($a);echo '</pre>';
/* this would print:
Array
(
[Monday] => Array
(
[Morning] => 1
[Afternoon] => 1
[Night] =>
)
[Tuesday] => Array
(
[Morning] => 1
[Afternoon] => 1
[Night] =>
)
...
)
*/
// this matrix can be displayed in a friendly way like this
$rows = array('Morning', 'Afternoon', 'Night');
$cols = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday');
echo '<table>';
echo '<tr>';
echo '<td> </td>';
foreach($cols as $col) {
echo '<td>'.substr($col, 0, 3).'</td>';
}
echo '</tr>';
foreach($rows as $row) {
echo '<tr>';
echo '<td>'.$row.'</td>';
foreach($cols as $col) {
echo '<td style="background-color:'.(isset($a[$col][$row]) && $a[$col][$row] ? 'green' : 'red').';"> </td>';
}
echo '</tr>';
}
echo '</table>';
// a nice table with green and red cells will be displayed