2017-09-21 89 views
1

我正在尝试根据数据库中的信息创建数据包。根据维数创建数据包

数据库的组织是这样的:

ID ORDERID DIMENSION QUANTITY 
1 21 8400  25 
2 21 7200  8 
3 21 4300  5 
4 21 3800  7 

第一件事,从数据库

$sql = "SELECT ID, ORDERID, DIMENSION, QUANTITY FROM dimension WHERE ORDERID = 21 ORDER BY DIMENSION DESC"; 

$q = $conn => query($sql); 

while($r = $q->tech()){ 
    $dim =$r['DIMENSION ']; 
    $quant =$r['QUANTITY ']; 
} 

然后,我从另一个表中检索数据,为前获取信息。我得到10号

$query = "SELECT QUANTITY FROM panel WHERE ID = 21; 

$q = $conn->query($query); 

while ($r=$q->fetch()){ 
    $number = 10; 
} 

使从最长尺寸包装是非常重要的。

例如,我有尺寸8400的数量25.面板的最大数量是10,这意味着我将有两个数据包,每10个面板将保留5个。 5进入下一个维度,我们将该面板的最大数量达到$数量。剩余的维度进入下一个维度,并保持这种状态。

一旦我得到的所有信息,我需要做包装,最后包装解决方案应该是

------------------- 
8400 x 10 - Packet1 
------------------- 
8400 x 10 - Packet2 
------------------- 
8400 x 5 
7200 x 5 - Packet3 
------------------- 
7200 x 3 
4300 x 5 
3800 x 2 - Packet4 
------------------- 
3800 x 5 - Packet 5 
------------------- 

一旦我得到这个数据,我应该将其插入到数据库 其中8400是尺寸,10,面板,“Packet1” - 名称

我被卡住了,不知道如何执行此操作。我不知道算法是否存在。

回答

0

你可以这样来做:

// assuming you have collected the results from your sql query like this: 
while($r = $q->tech()) $dat[]=array($r['DIMENSION'],$r['QUANTITY']); 

// you will end up with an array $dat: (dimension, quantity) like this: 
// $dat=array(array(8400,25),array(7200,8),array(4300,5),array(3800,7)); 
// package size: 
$n=10; 

$cnt=0;      // initialize package counter 
$pack=array();     // set up first package 
$d=array_shift($dat);   // get first lot $d from $dat 

do {  
    if ($d[1]>0){  
    $take=min($d[1],$n-$cnt); // decide how much to take out ... 
    $cnt+=$take;    // increase package counter 
    $d[1]-=$take;$pack[]=array($d[0],$take); // tranfer the goods ... 
           // if package is full, start next one 
    if ($cnt==$n) {$packs[]=$pack; $pack=array(); $cnt=0;} 
    } else if(count($dat)>0){ // still elements in $dat left? 
    $d=array_shift($dat);  // get the next lot $d from $dat 
    } else break;  
} while(true); 
if ($cnt>0) $packs[]=$pack; // collect the last "stranded" package ... 

echo str_replace("]],","]],\n ",json_encode($packs)); // as JSON string 
// print_r($packs);   // conventional (bulky) PHP object notation 

这导致以下结果(JSON对象):

[[[8400,10]], 
[[8400,10]], 
[[8400,5],[7200,5]], 
[[7200,3],[4300,5],[3800,2]], 
[[3800,5]]] 
+0

这正是我一直在寻找。一旦我得到这些信息,我需要将它存储在数据库中。我的表是有组织的ID | ORDERID | DIMENSION | QUANTITY |名称。我有订单ID,角钱(8400)和数量10.订单名称可以是第一组Packet1,第二组Packet2,对于第三种情况,Packet3对于这两个组将是相同的名称8400和7200.它增加1。是可能的。谢谢 –