根据维度制作数据包

时间:2017-09-21 14:38:47

标签: php

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

数据库以这种方式组织:

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

首先,从db

获取信息
$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进入下一个维度,我们将该面板的最大数量达到$ number。剩下的那个维度转到下一个维度,它就像那样。

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

-------------------
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” - 名称

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

1 个答案:

答案 0 :(得分: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]]]