我有一个2d的“包”数组,它们有自己指定的厘米大小。我需要将这些包优化分配到一个新的3d数组中,以表示每个最大容量为265cm的包托盘。
Current code,用于一维数组大小:
$default_cc_height_fa = 265; // size of the pallet in cm
$sh_array = [50, 45, 30, 60, 70, 80]; // array of packs
// sort the array of packs in decreasing order of size
usort($sh_array, function($a, $b) {
return $b - $a;
});
// initialize the array of pallets
$mix_cc_array = [];
// iterate through the array of packs
foreach ($sh_array as $pack) {
// try to fit the pack into an existing pallet
$packed = false;
foreach ($mix_cc_array as &$pallet) {
if ($pack <= $default_cc_height_fa - array_sum($pallet)) {
$pallet[] = $pack;
$packed = true;
break;
}
}
// if the pack does not fit into any existing pallet, create a new one
if (!$packed) {
$mix_cc_array[] = [$pack];
}
}
print_r($mix_cc_array);
如何调整上面的代码以适应这样的2d数组:
$sh_array = [
['id_product' => 13, 'size' => 50],
['id_product' => 13, 'size' => 45],
['id_product' => 13, 'size' => 30],
['id_product' => 13, 'size' => 60],
['id_product' => 13, 'size' => 70],
['id_product' => 13, 'size' => 80]
];
// array of array of packs
当然,我需要管理大小,但我需要将整行数据(包)推入子数组(托盘)。
2条答案
按热度按时间o0lyfsai1#
只需稍加修改,我们就可以循环遍历一个同时具有
id
和size
属性的包数组,为了比较当前pack
的大小和最大高度常量,我们还可以向pack
添加属性以累加所有内容。最后,因为我对退出两个循环都感兴趣,所以我使用了
continue 2
,尽管您也可以保留原来的$packed = false;
方法。omvjsjqw2#
my earlier answer和这个答案的唯一区别是如何对数组数据进行排序和计数,算法是一样的。
代码:(Demo)
1.按大小值降序排列行。
1.迭代您的产品阵列。
1.迭代一个新的数组,托盘将存储在其中。
1.如果给定的 Package “适合”所遇到的托盘,则将其推入该托盘;否则检查后续托盘;如果没有合适的托盘,创建一个新的托盘并将 Package 推入其中。