Billigste Versandkosten ausrechnen

1989moni1989

Mitglied
Hallo!

Ich brauche eure Hilfe. Ziel ist es, die für den Kunden günstigsten Versandkosten zu berechnen.

Die Situation ist folgene:
Ein Kunde will 23 Mineralwasserflaschen kaufen.

Es gibt folgende Arten zu liefern:
12 Flaschen: 12 €
6 Flaschen: 7 €
3 Flaschen 4 €
1 Flasche 2 €

Ich habe also folgenden HTML-Code.
PHP-Code:
Code:
$nBottles = 23;

$aShippingCosts = array(
    12 => 12,
    6 => 7,
    3 => 4,
    1 => 2
);
Wie berechne ich jetzt die günstigsten Versandkosten?

In diesem Fall wären es natürlich 2mal die 12er Versandbox. Das sind 24€ und es ist billiger als wenn ich eine 12er und zwei 6er oder eine 12er, eine 6er, eine 3er und zwei 1er nehme.

Wenn der Kunde aber nicht 23 sondern nur 19 Flaschen bestellen würde, dann wäre die günstigste Lösung eine 12er, eine 6er und eine 1er.

Ich würde über Ideen sehr dankbar. Sitze jetzt seit einigen Stunden davor und komme nicht weiter...

Monika
 
Das ist leider nicht so einfach, weil 12 und 12 ja billiger sind wie 12 und 6 und 3 und 1...

Meine Idee wäre jetzt folgende:

Ich bräuchte alle möglichken Kombinationen des Arrays.

zB
12 +12
12 + 6 + 6
12 + 6 + 3 + 3
12 + 6 + 3 + 1 + 1,
6 + 6 + 6 + 3 + 1 + 1
...
1 + 1 + 1 + 1 + 1 + 1 ...

Wenn ich alle möglichen Kombinationen habe bei denen die Zahl zwischen 23 und 23+12(größter Wert) ist und mir für alle diese den Versandpreis ausrechne, könnte ich dann einfach den kleinsten Versandpreis nehmen.

Aber wie kann ich mir aus diesem Array ein Array mit allen möglichen Kombinationen erstellen?
 
12+12 ist immer billger als 12+6+6. Ansosnsten habt ihr ein sehr schlechtes Mengenrabatsystem.

Oder aber du berechnest für jede Kombination (Anzahl-Preis) Den Flaschenprei. Sortierst nach diesem und stellst dein Sett zusammen

PHP:
$nBottles = 23;
 
// Hab jetzt extra mal eingebaut, dass 2*6 billiger ist als 12
$aShippingCosts = array(
    12 => 12,
    6 => 4,
    3 => 4,
    1 => 2
);


//für jede Menge den Preis pro Flasch berechnen
//Zudem den Array für den array_multisort umwandeln, da dort der index verloren geht
//Array<Anzahl=>Preis> ==> Array<Array<Anzahl, Preis, PreisPerFlasche> 
$pricePerItem = array();
$itemsCosts = array();
foreach($aShippingCosts as $items => $price){
	$pricePerItem[] = $price/$items;
	$itemsCosts[] = array($items, $price, $price/$items); 
}

//Das ganez nach Preis per Flasche sortieren
array_multisort($pricePerItem, SORT_ASC, $itemsCosts);


$rest = 0;
$sets = array();
$price = 0;
//Alle Sets durchgehen. dank der Sortierung versucht es möglichst 
//viel mit dem kleinsten Flaschenpreis zu nehmen
foreach($itemsCosts as $node){
	$rest = $nBottles % $node[0];
	$sets[$node[0]] = (int) floor($nBottles /  $node[0]);
	$price += $sets[$node[0]] * $node[1];
	$nBottles = $rest;	
}

//$sets wieder nach Flaschenanzahl sortieren -> ist besser lesbar
krsort($sets);

print_r($sets);
print_r($price);;

Code:
Array
(
    [12] => 0
    [6] => 3
    [3] => 1
    [1] => 2
)
20

Und mit deinen Werten (6 Flaschen kosten 7)
Code:
Array
(
    [12] => 1
    [6] => 1
    [3] => 1
    [1] => 2
)
27
 
Zurück