2013-01-14 2 views
3

편리한 방법/공식을 사용하여 항목이로드 된 소포/팔레트의 크기를 계산하는 PHP 함수를 작성하고자합니다.상품의 선적/스택에 대한 치수 계산

다음은 항목이있는 배열의 예입니다. 참고 : 일부 항목은 별도의 소포로 보내도록 플래그가 지정됩니다. 일부 항목은 기울어지지 않을 수 있습니다.

$items = array(
    1 => array(
    'quantity' => 1, 
    'weight' = 1, 
    'dimensions' => array(80, 50, 50), // Length, Width, Height 
    'separate' => true, // If the item should be sent as a separate package 
    'tiltable' => false, // False if the item has a 'this side up' sticker 
), 
    2 => array(
    'quantity' => 3, 
    'weight' = 1, 
    'dimensions' => array(21, 15, 10), 
    'separate' => false, 
    'tiltable' => true, 
), 
    3 => array(
    'quantity' => 2, 
    'weight' = 1, 
    'dimensions' => array(18, 19, 20), 
    'separate' => false, 
    'tiltable' => true, 
), 
    // ... and so on ... 
); 

아무도 조금이라도 지식이나 경험이 있습니까? 나는 바퀴를 재발 명하고 싶지 않다. * (구문 오류가 발생할 수 있습니다) *

function build_packages($items, $max_weight=0, $max_length=0, $max_width=0, $max_height=0) { 

    $packages = array(); 

    // Step through each item 
    foreach ($items as $item) { 

    // Twist and turn item. Longest side first ([0]=length, [1]=width, [2]=height) 
     if (!empty($item['tiltable'])) { 
     rsort($item['dimensions'], SORT_NUMERIC); 
     } else { 
     if ($item['dimensions'][0] < $item['dimensions'][1]) { 
      $item['dimensions'] = array($item['dimensions'][1], $item['dimensions'][0], $item['dimensions'][2]); 
     } 
     } 

    // Validate item 
     if (!empty($max_weight) && $item['weight'] > $max_weight) return false; 
     if (!empty($max_length) && $item[0] > $max_length) return false; 
     if (!empty($max_width) && $item[1] > $max_width) return false; 
     if (!empty($max_height) && $item[2] > $max_height) return false; 

    // Step through quantities 
     for ($i=0; $i<$item['quantity']; $i++) { 

     // Step through packages 
     $package_found = false; 
     foreach (array_keys($packages) as $key) { 

     // Skip to next package on certain conditions 
      if ($packages[$key]['separate']) continue; 
      // ... 

      // Do some logic 
      // ... 

     // Modify package 
      $package_found = true; 
      $packages[$key]['num_items']++; 
      $packages[$key]['weight'] += $item['weight']; 
      $packages[$key]['dimensions'] = array(0, 0, 0); // <--- Replace with new dimensions 

     // Twist and turn package. Longest side first ([0]=length, [1]=width, [2]=height) 
      if (!empty($item['tiltable'])) { 
      rsort($packages[$key]['dimensions'], SORT_NUMERIC); 
      } else { 
      if ($packages[$key]['dimensions'][0] < $packages[$key]['dimensions'][1]) { 
       $packages[$key]['dimensions'] = array($packages[$key]['dimensions'][1], $packages[$key]['dimensions'][0], $packages[$key]['dimensions'][2]); 
      } 
      } 

      break; 
     } 

     if ($package_found) continue; 

     // Add to a new package 
     $packages[] = array(
      'num_items' => 1, 
      'weight' => $item['weight'], 
      'dimensions' => $item['dimensions'], 
      'separate' => $item['separate'], 
      'tiltable' => $item['tiltable'], 
     ); 
     } 
    } 

    return $packages; 
    } 

케어 몇 가지 코드를 도울 :

내가 생각하고있는 기능은 다음과 같이인가?

답변

1

당신이 겪고있는 문제는 Bin Packing 문제의 해결책입니다. 솔루션은 NP Hard이므로 최적의 솔루션이 아닌 "충분한"솔루션을 찾고 싶을 수 있습니다. Google 검색 결과 : One Dimensional Bin Packing 클래스입니다. 나는 코드를 보지 않았으므로 그것이 얼마나 좋은지 잘 모르겠다. 그러나 적어도 조사를 시작하는 곳으로 제안한다. 1 차원 문제를 해결하기에 충분하다면 아마도 1 차원 레이아웃을 여러 개 작성하고 각 행의 최대 높이를 추적하여 전체 패키지 높이를 초과했는지 여부를 파악하는 솔루션을 만들 수 있습니다.

희망이 도움이됩니다.

+0

대답 해 주셔서 감사합니다. 그것은 새로운 방향으로 나를 가리킨다. :) – tim