PHP: 用自然语言翻译每周日历可用性?
PHP: Translate in natural language a weekly calendar availability?
我在我的数据库中存储了用户的每周可用性,如
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 或其他...
既然是矩阵,最好显示成矩阵,否则文字组合太多,你的应用程序的用户很难理解。
$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
7 种可能的组合(从最具体到最少):
Morning, Afternoon, Night
Morning, Afternoon
Morning, Night
Afternoon, Night
Morning
Afternoon
Night
您可以识别类似于 unix 权限识别方式的组合:
1 = "Morning - Night";
0 = "Morning - Afternoon";
1 = "Morning - Night";
1 = "Afternoon - Night";
0 = "Morning";
0 = "Afternoon";
[=11=]1 = "Night";
您的下一步是将日期与数组中它们各自的值进行匹配,
将一周中的几天视为 0-6(周日至周一)之间的整数。前周日的可用性。应该存储在索引 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
我在我的数据库中存储了用户的每周可用性,如
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 或其他...
既然是矩阵,最好显示成矩阵,否则文字组合太多,你的应用程序的用户很难理解。
$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
7 种可能的组合(从最具体到最少):
Morning, Afternoon, Night
Morning, Afternoon
Morning, Night
Afternoon, Night
Morning
Afternoon
Night
您可以识别类似于 unix 权限识别方式的组合:
1 = "Morning - Night";
0 = "Morning - Afternoon";
1 = "Morning - Night";
1 = "Afternoon - Night";
0 = "Morning";
0 = "Afternoon";
[=11=]1 = "Night";
您的下一步是将日期与数组中它们各自的值进行匹配, 将一周中的几天视为 0-6(周日至周一)之间的整数。前周日的可用性。应该存储在索引 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