Я пытаюсь заставить PHP настроить некоторые значения массива так, чтобы во всех случаях объекты передавались через функциональность, он сравнивал длину и высоту этих значений массива и выравнивал их как можно лучше.
Представьте себе, 3 коробки для сигарет. Они точно такого же размера, формы и объема, но один стоит, один лежит ровно, а другой на короткой стороне.
Затем представьте 4 сигаретную коробку. Его длина и ширина те же, что и у других пакетов, однако внутри контейнера больше сигаретных пачек, поэтому его высота (или ширина / длина зависит от ввода пользователя) для других пакетов.
Функция все еще должна пытаться ориентировать пакет в исходный пакет в массиве.
Пример сигаретных коробок не является реальным применением. У меня есть куча коробок, которые нужно отсортировать по общим правилам, чтобы их можно было сложить. Он должен быть достаточно умным, чтобы либо вычислять, либо игнорировать любые дополнительные фигуры, которые относятся к объектам аналогичного размера, по крайней мере, в 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
)
)
*/
?>
Задача ещё не решена.
Других решений пока нет …