2

我想存储和检索一个完全不依赖于实际日期的动态每周计划。

数据将存储在这样的 MySQL 表中(不按时间排序):

(Class 和 Instructor 列将存储其他表的引用 ID,但我在这里使用了实际名称以便一目了然地阅读)

----------------------------------------------------------------------
|    id    |    time    | dayofweek |    class    |    instructor    |
----------------------------------------------------------------------
|    1     |   6:30a    |     1     |    Zumba    |    Julie         |
----------------------------------------------------------------------
|    2     |   9:00a    |     3     |   Kickbox   |    Devon         |
----------------------------------------------------------------------
|    3     |   11:00a   |     4     |    Zumba    |    Alex          |
----------------------------------------------------------------------
|    4     |   6:30a    |     4     |    Dance    |    Karen         |
----------------------------------------------------------------------
|    5     |   5:00p    |     1     |    R-BAR    |    Karen         |
----------------------------------------------------------------------
|    6     |   5:00p    |     6     |    Dance    |    Karen         |
----------------------------------------------------------------------
|    7     |   9:00a    |     7     |    Kinder   |    Julie         |

最终输出在视觉上看起来像这样(按时间排序):

          ---------------------------------------------------------
          |  Sun  |  Mon  |  Tue  |  Wed  |  Thu  |  Fri  |  Sat  |
-------------------------------------------------------------------
|  6:30a  | Zumba |       |       | Dance |       |       |       |
-------------------------------------------------------------------
|  9:00a  |       |       |Kickbox|       |       |       |Kinder |
-------------------------------------------------------------------
|  11:30a |       |       |       | Zumba |       |       |       |
-------------------------------------------------------------------
|  5:00p  | R-BAR |       |       |       |       | Dance |       |
-------------------------------------------------------------------

但我不知道如何有效地完成这项工作。我今天已经在 Google 上搜索了几个小时,并且遇到了一些看起来可能有用的帖子,但它从来都不是我想要的。

我开始考虑通过函数或其他方式为每个时间段的 7 天中的每一天运行一个单独的查询,但这对于这样一个简单的任务来说非常草率并且查询太多。显然,所有 7 天(列)将始终显示,但时间段(行)可以随时添加或删除,具体取决于当时是否有事件。

接下来,我研究了将所有内容存储在一个数组中,并将所有行与重复时间组合起来,然后逐个处理它们的日子。我不确定我会如何动态地做到这一点......

我找到了这个例子,我认为它非常接近我所需要的: PHP - Merge duplicate array keys in a multidimensional array

毕竟,我计划制作一个简单的管理页面供用户添加或删除事件。有任何想法吗?

4

2 回答 2

1

我会建议以下方法:

  1. SELECT DISTINCT time FROM table;

  2. SELECT DISTINCT dayofweek FROM table;

  3. SELECT * FROM table;

  4. 使用星期几构建列。(第二次查询结果)

  5. 用行动时间构建行。(第一个查询结果)
  6. 对于表格的每个单元格(不包括第一行和第一列)使用

    foreach($result /* of 3rd query */ as $row){
         if(($row['time'] == $celltime) && ($row['day'] == $cellday)){
              // show formatted row
              // remove row from result buffer, so it should never appear again
              // also row removement would increase speed for further search
          } else {
              // ignore or something
          }
    }
    

好的是基于timeand dayofweek、like'cell-9:00a-3''cell-11:00a-4'(with id.split('-').slice(1)) 构建每个单元格 id,因此您可以在运行时使用 javascript / 或通过 ajax 进一步提交单元格的这些数据。


伊瑟,我建议将您的表格标准化,将其分成 3-4 个或更多(如果需要):

数据模型(标准化)

其中UN= 无符号,NN= 非空,AI= AUTO_INCREMENT

好处:

  1. 您可以更快地访问DISTINCT数据列,因为它们是分开的。
  2. 您可以通过单元格 ID 更轻松地访问值,'cell-1-2-3-4'例如

    list(, $timeId, $dayId, $classId, $instructorId) = explode('-', $_POST['cell']);
    

    如果,您将发布您想要修改的位置或内容。

  3. 较少重复VARCHAR()或字符串数​​据。
  4. 这也解决了时隙移除问题,因为可能配置ON CASCADE DELETE为 for FK_Schedule_Time

ETC...


UPDv1:

好吧,让我们试着想象一下我的意思:

可视化的UI方案

我的意思是,要显示时间表(或任何其他数据透视表),您应该获得标签行/列的不同值,即日期名称/数字或时间。然后建立一个表,其中包含不同的值,作为绘图的 X / Y。然后,寻找 [X:Y] 交叉点(如图形上的点)——它们将是旋转数据。

我曾经写过的一个时间表已经占用了我生命中的 3 个月。我不会说它现在很完美,但它确实有效。尝试简化您的任务:拆分为更小的任务。然后你会看到更大的画面。

于 2013-05-03T03:42:22.103 回答
1
$a=array();

$a[] = array( 'id'=>'1' ,'time'=>'6:30a'   , 'dayofweek'=>'2' ,    'class'=>'Zumba');
$a[] = array( 'id'=>'2' ,'time'=>'6:40a'   , 'dayofweek'=>'3' ,    'class'=>'Zumba');
$a[] = array( 'id'=>'2' ,'time'=>'6:20a'   , 'dayofweek'=>'3' ,    'class'=>'Zumba');
$a[] = array( 'id'=>'2' ,'time'=>'1:20p'   , 'dayofweek'=>'3' ,    'class'=>'Zumba');

$new_array=array();
foreach($a AS $k =>$v){
     if(!array_key_exists($v['time'],$new_array)){
          $new_array[$v['time']]=array("","","","","","","","");
          unset($new_array[$v['time']][0]);
     }

    $new_array[$v['time']][$v['dayofweek']]=$v['class'];

}

function cmp($a, $b)
{

    $a = preg_replace('{\:}', '', $a);
    $a = preg_replace('{a}', '', $a);
    $a = preg_replace('{(.*?)p}', '100$1', $a);
    $a = (int)$a;
    $b = preg_replace('{\:}', '', $b);
    $b = preg_replace('{a}', '', $b);
    $b = preg_replace('{(.*?)p}', '100$1', $b);
    $b = (int)$b;

    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;  
}


uksort($new_array, "cmp");
$weekmap = array( '','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
print_r($new_array);



foreach($new_array AS $k =>$v){
echo $k.'::';
        foreach($v AS $k1 =>$v1){
            //echo $weekmap[$k1];
            //echo '->';
            if($v1==''){
            echo 'null';
            }
            echo $v1;
            echo '|';
        }
         echo PHP_EOL;
}

输出

Array
(
    [6:20a] => Array
        (
            [1] => 
            [2] => 
            [3] => Zumba
            [4] => 
            [5] => 
            [6] => 
            [7] => 
        )

    [6:30a] => Array
        (
            [1] => 
            [2] => Zumba
            [3] => 
            [4] => 
            [5] => 
            [6] => 
            [7] => 
        )

    [6:40a] => Array
        (
            [1] => 
            [2] => 
            [3] => Zumba
            [4] => 
            [5] => 
            [6] => 
            [7] => 
        )

    [1:20p] => Array
        (
            [1] => 
            [2] => 
            [3] => Zumba
            [4] => 
            [5] => 
            [6] => 
            [7] => 
        )

)
6:20a::null|null|Zumba|null|null|null|null|
6:30a::null|Zumba|null|null|null|null|null|
6:40a::null|null|Zumba|null|null|null|null|
1:20p::null|null|Zumba|null|null|null|null|

http://sandbox.onlinephpfunctions.com/code/8da03b1833f58e7f60888cfcfb6e544cd3ff10ad

于 2013-05-03T04:22:32.370 回答