2015-03-07 2 views
0

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

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

Прежде всего, необходимо установить некоторые правила, как то, что вы предпочитаете группе. Если это будни, я бы создал структуру данных (в простейшем случае многомерный массив), которая группируется таким образом. – ChristianM

+1

У меня кошмары, думающие, что база данных хранится как: time -> Night Night. наличие -> да. Если это так, первое, что вам нужно сделать, это разбить будний день и часть дня ... – barbarity

ответ

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). Возможность воскресенья для бывшего. должен быть помехой в индексе 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

Вау, большое спасибо !!! – Francesco

+0

Несомненно! дайте мне знать, если вы столкнетесь с большим количеством проблем! –

+1

$ 101 = Должно быть, я думаю, «Утро ИЛИ ночь» (не тире -), потому что он недоступен днем ​​... – Francesco

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 
Смежные вопросы