我正在尝试根据数据库中的信息创建数据包。
数据库以这种方式组织:
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” - 名称
我被卡住了,不知道如何执行此操作。我不知道算法是否存在。
答案 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]]]