<body>
';
// Render Place Order page
echo '<form method="post">' . "<br>\n";
echo "Select items:<br>\n";
foreach ($itemList as $key => $item) {
    echo '<input type="checkbox" name="items[]" id="item_' . $key . '" value="' . $key . '"> <label for="item_' . $key . '">' . $item[0] . ' - $' . $item[1] . ' - ' . $item[2] . 'g</label>';
    echo "<br>\n";
}
echo "<br>\n";
echo "Select algorithm:<br>\n";
echo '<input type="radio" name="algo" checked value="' . PackageDistributor::ALGO_BEST_PRICE . '">Best Price<br>
<input type="radio" name="algo" value="' . PackageDistributor::ALGO_EVENLY_DISTRIBUTED . '">Evenly Distributed' . "<br>\n";
echo "<br>\n";
echo '<input type="submit" value="Place Order"><br>';
echo "</form><br>\n";
if (isset($_POST['items'])) {
    $algoType = $_POST['algo'];
    $items = $_POST['items'];
    $order = new Order($items, $itemList);
    $distributor = new PackageDistributor($algoType);
    $calc = new ShippingChargeCalculator();
    $renderer = new PackageRenderer($calc);
    $distributor->distributeItems($order, _MAX_PRICE_PER_PACKAGE_);
    echo "This order has following packages:<br>";
    echo $renderer->renderPackages($order->getPackages());
}
echo '
</body>
</html>
';
 public function testBestPriceAlgoDistributeItemsBasedExampleWithExtraItem()
 {
     $itemList = [['Item 1', 10, 200], ['Item 2', 100, 20], ['Item 3', 30, 300], ['Item 4', 20, 500], ['Item 6', 40, 10], ['Item 7', 200, 10], ['Item 55', 50, 100]];
     $order = new Order([0, 1, 2, 3, 4, 5, 6], $itemList);
     $dist = new PackageDistributor(PackageDistributor::ALGO_BEST_PRICE);
     $dist->distributeItems($order, 250);
     // Here it distributes items into 2 packages with lower price than before but not eveny distributed
     $this->assertEquals(250, $order->getPackages()[0]->getTotalPrice());
     $this->assertEquals(110, $order->getPackages()[0]->getTotalWeight());
     $this->assertEquals(200, $order->getPackages()[1]->getTotalPrice());
     $this->assertEquals(1030, $order->getPackages()[1]->getTotalWeight());
 }