전체 절단 횟수, * '900' => 900 규격 매수(0 or 1), * '800' => 800 규격 매수(0 or 1), * '600' => 600 규격 매수(0 or 1), * '400' => 400 규격 매수(0 or 1), * '300' => 300 규격 매수(0 or 1), * 'remaining'=> 최종 남은 높이(mm) * ] */ function calculateCutSize(string $itemSelect, int $height): array { // 1) 기준 폭 선택 switch ($itemSelect) { case (strpos($itemSelect, '실리') !== false): $value = 1220; $threshold = 940; $itemSelect='실리카'; break; case (strpos($itemSelect, '와이어') !== false): $value = 1180; $threshold = 900; $itemSelect='와이어'; break; case (strpos($itemSelect, '화이') !== false): $value = 1200; $threshold = 924; $itemSelect='화이바'; break; default: throw new InvalidArgumentException("지원하지 않는 원단: {$itemSelect}"); } // 2) 시접 추가 $makeVertical = $height + 140 + floor($height / $value) * 40; // 3) 기본 절단 횟수 $firstCut = (int) floor($makeVertical / $value); // 4) 남은 높이 계산 $remaining = $makeVertical - ($firstCut * $value); // 5) 남은 높이가 임계치 넘으면 추가 절단 if ($remaining > $threshold) { $firstCut++; // $remaining -= $value; } // 6) 공차별 분류 범위 정의 $ranges = [ '실리카' => [ '900' => [841, 940], '800' => [641, 840], '600' => [441, 640], '400' => [341, 440], '300' => [ 1, 340], ], '와이어' => [ '900' => [801, 900], '800' => [601, 800], '600' => [401, 600], '400' => [301, 400], '300' => [ 1, 300], ], '화이바' => [ '900' => [825, 924], '800' => [625, 824], '600' => [425, 624], '400' => [325, 424], '300' => [ 1, 324], ], ]; // 7) 결과 배열 구성 $result = [ 'firstCut' => $firstCut, 'remaining' => $remaining, ]; foreach ($ranges[$itemSelect] as $key => [$min, $max]) { $result[$key] = ($remaining >= $min && $remaining <= $max) ? 1 : 0; } return $result; } ?>