[ 'ups' => [ '03' => '1-5 business days', ], 'fedex' => [ 'FEDEX_EXPRESS_SAVER' => '1-3 business days', 'FEDEX_GROUND' => '1-5 business days', 'GROUND_HOME_DELIVERY' => '1-5 business days', ], 'usps' => [ '1' => '1-3 business days', '4' => '2-8 business days', ], ], 'Two-Day Shipping' => [ 'ups' => [ '02' => '2 business days', ], 'fedex' => [ 'FEDEX_2_DAY' => '2 business days', ], ], 'One-Day Shipping' => [ 'ups' => [ '01' => 'next business day 10:30am', '13' => 'next business day by 3pm', '14' => 'next business day by 8am', ], 'fedex' => [ 'STANDARD_OVERNIGHT' => 'overnight', ], ], ]; public static function factory($shipping_options = []) { $object = new self(); if (!empty($shipping_options)) { $object->shipping_options = $shipping_options; } return $object; } /** * @return array */ public function getApprovedCodes($carrier = null) { $approvedCodes = []; // Build approvedCodes foreach ($this->shipping_options as $shipping_group => $row) { foreach ($row as $_carrier => $row2) { if (!isset($approvedCodes[$_carrier])) { $approvedCodes[$_carrier] = []; } foreach ($row2 as $code => $display) { $approvedCodes[$_carrier][] = $code; } } } if ($carrier !== null && isset($approvedCodes[$carrier])) { return $approvedCodes[$carrier]; } return $approvedCodes; } public function getDisplayRates($rates) { // Build output array with cheapest shipping option for each group $display_rates = []; foreach ($this->shipping_options as $shipping_group => $row) { $display_rates[$shipping_group] = []; $cheapest_row = null; foreach ($row as $carrier => $row2) { $group_codes = array_keys($row2); if (! empty($rates[$carrier])) { foreach ($rates[$carrier] as $row3) { if (in_array($row3->getCode(), $group_codes)) { $row3->setCarrier($carrier); if ($cheapest_row === null) { $cheapest_row = $row3; } else { if ($row3->getCost() < $cheapest_row->getCost()) { $cheapest_row = $row3; } } } } } } // Add row if it exists if (! empty($cheapest_row)) { $display_rates[$shipping_group][] = $cheapest_row; } } return $display_rates; } public function getAllDisplayRates($rates) { // Build output array listing all group options $display_rates = []; foreach ($this->shipping_options as $shipping_group => $row) { $display_rates[$shipping_group] = []; foreach ($row as $carrier => $row2) { $group_codes = array_keys($row2); if (!empty($rates[$carrier])) { foreach ($rates[$carrier] as $row3) { if (in_array($row3->getCode(), $group_codes)) { $row3->setCarrier($carrier); $display_rates[$shipping_group][] = $row3; } } } } $this->sortByCost($display_rates[$shipping_group]); } return $display_rates; } protected function sortByCost(&$rates) { uasort($rates, function ($a, $b) { return ($a->getCost() > $b->getCost()); }); } }