PHP: Перевести на естественном языке еженедельный календарь доступности?

0

У меня в еженедельной доступности моей базы данных БД,

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.

в основном это матрица 7x3, и я пытаюсь найти способ выразить ее на языке, подобном

Майк доступен "MON-WED, Morning thru afternoon"

или что-то подобное...

мой мозг взрывается, чтобы понять лучший способ справиться с этим.

Я использую PHP, но могу быть JS или что-то еще...

  • 0
    Сначала вам нужно установить некоторые правила, например, то, что вы предпочитаете группировать. Если бы это были дни недели, я бы создал структуру данных (в простейшем случае многомерный массив), которая группируется таким образом.
  • 1
    У меня ночные кошмары, думая, что база данных хранится как: время -> среда ночью. наличие -> да. Если это так, первое, что вы должны сделать, это разорвать будний день и часть дня ...
Теги:
algorithm
nlp

2 ответа

1
Лучший ответ

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 (sun-mon). Воскресная доступность для ex. должен быть помехой с индексом 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
  • 1
    вау, большое спасибо !!!
  • 0
    Конечно, вещь! дайте мне знать, если у вас возникнут дополнительные проблемы!
Показать ещё 1 комментарий
0

Так как это матрица, лучше отобразите ее как матрицу, иначе текстовых комбинаций слишком много, и это будет трудно понять для пользователей вашего приложения.

$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>&nbsp;</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').';">&nbsp;&nbsp;&nbsp;</td>';
    }
    echo '</tr>';
}
echo '</table>';

// a nice table with green and red cells will be displayed

Ещё вопросы

Сообщество Overcoder
Наверх
Меню