2013-05-03 2 views
2

실제 주간 일정에 의존하지 않는 동적 주간 일정을 저장하고 검색하고 싶습니다. 매주 반복 일정을 저장/표시하는 방법

데이터

은 (시간으로 정렬되지 않음)과 같은 MySQL의 테이블에 저장 될 것입니다 :

(클래스 및 강사 열이 다른 테이블의 참조 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 |  | 
------------------------------------------------------------------- 

을하지만 주위에 내 머리를 정리하고 수 없습니다 이것을 효율적으로 수행하는 방법. 나는 오늘 구글을 몇 시간 동안 검색해 보았지만 작동하는 것처럼 보이는 몇 개의 게시물을 보았지만 내가 찾던 적이 결코 없다.

나는 함수 또는 다른 방법을 통해 시간 슬롯 당 7 일 각각에 대해 별도의 쿼리를 실행하는 것에 대해 생각해 봤지만 그런 단순한 작업에 대해서는 너무 엉성하고 너무 많은 쿼리입니다. 분명히 모든 7 일 (열)은 항상 표시되지만 시간에 이벤트가 있으면 시간대 (행)는 언제든지 추가되거나 제거 될 수 있습니다.

다음 모든 것을 배열에 저장하고 모든 행을 중복 된 시간으로 결합한 다음 하나씩 순서대로 처리하는 방법을 살펴 보았습니다. 나는

나는이 예제를 발견 ... 내가 동적하지만 그렇게 할 것입니다 방법을 잘 그리고 난 내가 필요에 아주 가까이 생각 : 결국 PHP - Merge duplicate array keys in a multidimensional array

말했다되고 내가 계획하고 수행 사용자가 이벤트를 추가하거나 제거 할 수있는 간단한 관리 페이지를 만드는 방법에 대해 설명합니다. 어떤 아이디어?

답변

1

나는 방법 다음과 같은 제안합니다 : 요일과

  1. SELECT DISTINCT time FROM table;

  2. SELECT DISTINCT dayofweek FROM table;

  3. SELECT * FROM table;

  4. 빌드 열을. (두 번째 쿼리 결과)

  5. 동작 시간에 따라 행을 작성하십시오. (1 질의 결과) 테이블의 각 셀에 대한
  6. (1 행과 1 열을 제외)

    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 
         } 
    } 
    

좋은 일을 사용 'cell-9:00a-3'처럼 timedayofweek에 따라 각 셀 ID를 구축하는 것입니다, 또는 'cell-11:00a-4' (id.split('-').slice(1))이므로이 데이터를 javascript /로 런타임에 추출하거나 아약스를 통해 제출할 수 있습니다.


Eather, 나는 3-4 이상 (필요한 경우)로 분할, 테이블을 정상화하는 것이 좋습니다 :

Data Model (normalized)

경우 UN = 부호, NN = NOT NULL, AI = AUTO_INCREMENT.

장점 : 그들은 분리하고로

  1. 당신은 DISTINCT 데이터 열에 더 빠르게 액세스 할 수 있습니다.
  2. 당신은 어디

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

    'cell-1-2-3-4' 같은 셀 ID를 통해 값에보다 쉽게 ​​액세스를 게시합니다 수, 경우 또는 당신이 수정할.

  3. VARCHAR() 또는 문자열 데이터의 반복이 적습니다.
  4. 이렇게하면 FK_Schedule_TimeON CASCADE DELETE으로 구성 될 수 있으므로 시간 슬롯 제거 문제도 해결됩니다. 등

...


UPDv1는 :

글쎄, 내가 의미 한 것을 시각화하는 시도 할 수 있습니다 :

Visualized UI scheme

내 말은, 그에게 표시 일정 (또는 다른 피벗 테이블)을 사용하려면 고유 한 라벨 행/열의 값, 즉 요일 이름/숫자 또는 시간. 그런 다음 plot의 X/Y처럼 별개의 값을 포함하는 테이블을 작성하십시오. 그런 다음 [X : Y] 교차점 (그래프상의 점과 같음)을 찾으십시오. 피벗 된 데이터가됩니다.

내가 한 번 작성한 일정은 내 생애에서 3 개월을 보냈습니다. 나는 그것이 완벽하다고 말하지 않을 것이다. 그러나 그것은 효과적이다. 작업을 단순화하십시오. 작은 작업으로 분할하십시오. 그러면 더 큰 그림이 보일 것입니다.

+0

너무 감사합니다! 미안 해요, 이걸로 머리카락을 뽑아 내고 떠나 갔는데 ... 3 개월이 걸렸을 거예요. 하. 이 솔루션은 내가 원했던 것과 거의 비슷하지만 실제로 클릭하지 않는 지점이 있습니다. 당신은 행을 만들고 다음 행을 만들라고 말합니다 ... 나는 그 생각을 파악하는 데 어려움을 겪고 있습니다. 나는 항상 그 행을 시작했고 그 다음 열로 그것을 가로 질러 일했다. 나도 물어봐야할지 모르겠다. 그것은 의미가있는 것처럼 보이지만, 나는 그것을 잃어 버립니다. – user2345372

+0

그건 그렇고, 나는 스케줄 테이블, 클래스 테이블, 강사의 테이블을 가지고있다. 스케줄 테이블에 직접 저장할 수있는 고정 된 세트 중 하나 일 뿐이므로 시간 테이블이 필요하지 않다고 생각합니다. – user2345372

+0

@ user2345372 늦게 답변드립니다. 나는':)'을 재배치했다. ** UPDv1 ** section을 참조하라. – BlitZ

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

+0

안녕하세요, 잠시 기다려 왔지만 저는 좌절감을 느끼고 방금 걸어 나갔습니다. 나는 그 조각을 따라갈 수는 있지만 꽤 빨리 나를 잃어 버린다. 네가 각 단계에서 어떤 일이 벌어지고 있는지 나에게 설명해 줄 수는 없을지 모르겠다. 그렇지? 나의 목표는 그것을 배우는 것입니다. 그래서 나는 단지 복사물과 깔판이 아닙니다. 비록 당신이 단순히 코드를 주석 ... 경우에도? – user2345372

관련 문제