2010-12-03 64 views
0

我正在mySql表中为每个预留一行预订系统。该行包含三列:上午,下午和晚上。在php中无法算出算法

reservation_id | date | morning | afternoon | evening 
int(255)  | d/t | 1/0  | 1/0  | 1/0 

通过使用以下GUI的用户可以添加或减去更多或更少的项目为三个不同的部分:

example-row

我想重新写任何可能的设置( > 0)的数字尽可能少的行放在我的预定表中。 例如:

morning | afternoon | evening 
3  | 1   | 2 

可以转化为(3 + +一个2 =)6行中的MySQL表。但是,这将是更好该输入转换成三排:

  | morning | afternoon | evening 
row 1  | 1  | 1   | 1 
row 2  | 1  | 0   | 1 
row 3  | 1  | 0   | 0 

可能有人帮我写这个算法? 提前谢谢! R

//回复 表中的每一行都是一条船。在主要概述中,对于每行包含预订或早晨,或下午或晚上的同一船,三行是很奇怪的。

+1

这会更好吗?看起来数据持久性会牺牲可读性来节省少量空间。为什么甚至没有一个值为3,1和2的行(改变数据类型,看起来)? – David 2010-12-03 20:08:08

回答

0
<?php 
$data = array('morning' => 3, 'afternoon' => 2, 'evening' => 1); 

for($i=0;$i<max($data);$i++) { 
    $m = ($data['morning']<=$i) ? 0 : 1; 
    $a = ($data['afternoon']<=$i) ? 0 : 1; 
    $e = ($data['evening']<=$i) ? 0 : 1; 
    mysql_query("INSERT INTO x(morning, afternoon, evening) VALUES($m, $a, $e)"); 
} 
+0

这很好用! – richardverbruggen 2010-12-03 20:43:29

0

在伪代码:

while($morning > 0 || 
     $afternoon > 0 || 
     $evening > 0) 
{ 
     $thisMorning = ($morning == 0 ? 0 : 1); 
     $thisAfternoon = ($afternoon == 0 ? 0 : 1); 
     $thisEvening = ($evening == 0 ? 0 : 1); 

     insert_row ($thisMorning, $thisAfternoon, $thisEvening); 

     if ($morning > 0) $morning--; 
     if ($afternoon > 0) $afternoon--; 
     if ($evening > 0) $evening--; 
} 
0
$morn = 3; 
$aft = 2; 
$eve = 1; 

while($morn > 0 || $aft > 0 || $eve > 0) { 
    $row = array(); 
    $row['morn'] = $morn-- > 0 ? 1 : 0; 
    $row['aft'] = $aft-- > 0 ? 1 : 0; 
    $row['eve'] = $eve-- > 0 ? 1 : 0; 
    $rows[] = $row; 
} 
0

现代计算机和现代数据库是如此之快,你真的不需要担心重复。使用最简单的表示法,而不是使用最少行的表示法。你不必担心行数,直到你达到1,000,000,甚至是可以辩论的。

+0

由于性能问题,我不想这样做。 (尽管我喜欢干净的数据库:))之所以会这样,是因为每一行的表示都是真实的物理对象(一条船)。 – richardverbruggen 2010-12-03 20:35:26