我试图让PHP调整一些数组值,以便在通过该功能传递的对象的所有实例中,它将比较这些数组值的长度和高度,并尽可能地对齐它们。
想象一下,3个香烟盒。它们的大小,形状和体积完全相同,但是一个是站立的,一个是平躺的,另一个是短的。
然后,想象一下第四个香烟盒。它与其他数据包的长度和宽度相同,但它在容器内有更多的香烟包,因此使其高度(或宽度/长度取决于用户输入)与其他包。
该函数仍应尝试将数据包定位到数组中的原始数据包中。
香烟纸盒的例子不是真正的应用。我有一堆盒子需要分成常见的排列,以便它们可以堆叠。它应足够智能,以便在至少2次测量中计算或忽略与相似尺寸的物体相关的任何其他形状。如果所有3个大小相同但方向不同,则应在适用的地方对其进行纠正,或者如果无法比拟则将其从循环中解脱出来。
我已经模拟了一些示例PHP代码,它应该提供一些好的测试用例和预期的结果。
任何帮助都非常受欢迎,我已经尝试了很多array_diffs和array_intersects的组合,但似乎在所有场景的1个解决方案上都很短暂。
更新
我想我开始认识到有3类计算。实施后,他们可能会被重构。
如果你考虑第一个不会被旋转的对象,那么它有三种可能性,我可能需要为每个对象编写单独的逻辑来应用它下面的每个循环。案例1和案例2的逻辑可能有些相似......
所以它至少消除了一些因素......仍在努力......
<?php
$params['object'] = array();
/* START TEST 1 */
$params['object'][] = array( 'height'=>'30',
'width'=>'10',
'length'=>'20');
$params['object'][] = array( 'height'=>'20',
'width'=>'30',
'length'=>'30');
/* END TEST 1 */
/* START TEST 2
$params['object'][] = array( 'height'=>'30',
'width'=>'30',
'length'=>'20');
$params['object'][] = array( 'height'=>'30',
'width'=>'20',
'length'=>'30');
/* END TEST 2 */
/* START TEST 3
$params['object'][] = array( 'height'=>'30',
'width'=>'16',
'length'=>'14');
$params['object'][] = array( 'height'=>'30',
'width'=>'20',
'length'=>'30');
/* END TEST 3 */
echo '<PRE>';
echo 'INPUT<BR>';
print_r($params['object']);
//Check for common orientations
/* PLEASE KEEP BETWEEN HERE --- */
$rotated = array();
foreach($params['object'] as $on=>$outer){
if(in_array($on,$rotated)){ continue; }
$rotated[$on] = $on;
if($oo['width']==$oo['length'] && $oo['length']==$oo['height']){ continue; }
$oo = array('width'=>$outer['width'],
'length'=>$outer['length'],
'height'=>$outer['height']);
foreach($params['object'] as $in=>$inner){
if(in_array($in,$rotated)){ continue; }
if($in==$on){ continue; }
$ii = array('width'=>$inner['width'],
'length'=>$inner['length'],
'height'=>$inner['height']);
/* --- TO HERE */
//DETERMINE HOW TO ROTATE THESE???
//IF ROTATED, MARK AS ROTATED[$in] TO PREVENT FURTHER ROTATIONS TO OCCUR TO THIS ITEM
$rotated[$in] = $in;
}
}
echo 'OUTPUT<BR>';
print_r($params['object']);
/* TEST 1 OUTPUT SHOULD BE - ALIGNED SAME ORIENTATION, BUT EACH OBJ IS DIF WIDTH
- same logic should work if any of the H/W/L are in different orders but values consistant in any 2 pairs
Array
(
[0] => Array
(
[height] => 30
[width] => 10
[length] => 20
)
[1] => Array
(
[height] => 30
[width] => 30
[length] => 20
)
)
*/
/* TEST 2 OUTPUT SHOULD BE - SAME VALUES, SO ALIGN COMPLETELY
- same logic should work if any of the H/W/L are in different orders
Array
(
[0] => Array
(
[height] => 30
[width] => 30
[length] => 20
)
[1] => Array
(
[height] => 30
[width] => 30
[length] => 20
)
)
*/
/* TEST 3 OUTPUT SHOULD BE - NO CHANGE BECAUSE LESS THAN 2 COMPATIBLE MEASUREMENTS, NO ADD TO $rotation[$in]
Array
(
[0] => Array
(
[height] => 30
[width] => 16
[length] => 14
)
[1] => Array
(
[height] => 30
[width] => 20
[length] => 30
)
)
*/
?>