Ankündigung

Einklappen
Keine Ankündigung bisher.

Ermittlung der Versandkosten nach Gewicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • ThaRider
    antwortet
    Zitat von Der_Gerhard
    Tja, eine optimale Verteilung dürfte nicht ganz einfach sein.

    Das ist allerdings kein PHP-Problem, sondern betrifft jede Programmiersprache.

    Hier mal ein erster Ansatz (straight forward):
    Voraussetzung ist, dass Du ein Array hast, das alle Artikel enthält.

    1) Generiere ein Array, dass jeden Artikel einzeln enthält (bei mehreren gleichen Artikeln also mehrere Einträge im Array). Zu jedem Artikel auch gleich das Gewicht eintragen.
    2) Sortiere das Array absteigend nach Gewicht.
    3) Fang mit einem leeren Paket an. Freies Gewicht = 30kg
    4) Erzeuge ein Array, in das weitere Arrays für die einzelnen Pakete eingetragen werden.
    5) Erzeuge ein neues Array, in dem die Artikel für dieses Paket eingetragen werden. Trage es in das Array aus 4) ein
    6) Nimm den ersten Artikel, der noch in das Paket passt. -> Ziehe das Gewicht vom freien Gewicht ab. Entferne den Eintrag aus dem ursprünglichen Array und trage ihn in das Array für das Paket ein.
    7) Wenn das Array mit den zu verpackenden Artikeln noch nicht bis zum Ende durchlaufen wurde, mach bei 6) weiter.
    Wenn Du am Ende des Arrays angekommen bist, können keine weiteren Artikel mehr in das Paket gepackt werden. -> Paket ist voll. Ermittle das tastächliche Gesamtgewicht des Pakets und den zugehörigen Preis. Mache bei 5) weiter.

    Das ganze ist an den "Best-Fit"-Mechanismus bei Speicherbelegung angelehnt. Wenn Du mal nach Mechanismen zur "Memory allocation" suchst, kannst Du Dir noch andere Ideen (First Fit, Worst Fit, etc.) holen. Garantiert bessere Ergebnisse liefern die aber vermutlich auch nicht.

    Danke für deine Mühe!

    Scheint doch nicht so ganz einfach zu sein, wie ich gedacht habe.
    Dann muss ich mich wohl erstmal gründlich mit Arrays beschäftigen.

    Eine einfachere Lösung gibt es ganz sicher nicht?

    Einen Kommentar schreiben:


  • Der_Gerhard
    antwortet
    Tja, eine optimale Verteilung dürfte nicht ganz einfach sein.

    Das ist allerdings kein PHP-Problem, sondern betrifft jede Programmiersprache.

    Hier mal ein erster Ansatz (straight forward):
    Voraussetzung ist, dass Du ein Array hast, das alle Artikel enthält.

    1) Generiere ein Array, dass jeden Artikel einzeln enthält (bei mehreren gleichen Artikeln also mehrere Einträge im Array). Zu jedem Artikel auch gleich das Gewicht eintragen.
    2) Sortiere das Array absteigend nach Gewicht.
    3) Fang mit einem leeren Paket an. Freies Gewicht = 30kg
    4) Erzeuge ein Array, in das weitere Arrays für die einzelnen Pakete eingetragen werden.
    5) Erzeuge ein neues Array, in dem die Artikel für dieses Paket eingetragen werden. Trage es in das Array aus 4) ein
    6) Nimm den ersten Artikel, der noch in das Paket passt. -> Ziehe das Gewicht vom freien Gewicht ab. Entferne den Eintrag aus dem ursprünglichen Array und trage ihn in das Array für das Paket ein.
    7) Wenn das Array mit den zu verpackenden Artikeln noch nicht bis zum Ende durchlaufen wurde, mach bei 6) weiter.
    Wenn Du am Ende des Arrays angekommen bist, können keine weiteren Artikel mehr in das Paket gepackt werden. -> Paket ist voll. Ermittle das tastächliche Gesamtgewicht des Pakets und den zugehörigen Preis. Mache bei 5) weiter.

    Das ganze ist an den "Best-Fit"-Mechanismus bei Speicherbelegung angelehnt. Wenn Du mal nach Mechanismen zur "Memory allocation" suchst, kannst Du Dir noch andere Ideen (First Fit, Worst Fit, etc.) holen. Garantiert bessere Ergebnisse liefern die aber vermutlich auch nicht.

    Einen Kommentar schreiben:


  • ThaRider
    antwortet
    Zitat von Der_Gerhard
    Hast Du denn eine Idee, wie Du die Artikel, die Du versenden willst, sinnvoll auf mehrere Pakete aufteilen kannst? Einfach 30kg für das erste Paket ansetzen ist etwsa zu einfach. Wenn Du lauter Artikel mit 11kg verschickst, passt das nicht.

    Eine Methode zum optimalen Auffüllen der Pakete (die Größe muss man ja auch noch beachten) wäre mal Voraussetzung für alle weiteren Schritte.

    Erstmal vielen Dank für deine Antwort!

    Dein Einwand ist nicht ohne, bloß wie kann man sowas realisieren?
    Ich bin nun auch nicht der PHP-Profi und wenn ich mal wenigstens einen Ansatz hätte (evtl. ein Beispiel aus nem anderen Script oder so) dann würde ich auch vielleicht alleine die Lösung finden.

    Freue mich auf weitere hilfreiche Vorschläge.

    Einen Kommentar schreiben:


  • Der_Gerhard
    antwortet
    Hast Du denn eine Idee, wie Du die Artikel, die Du versenden willst, sinnvoll auf mehrere Pakete aufteilen kannst? Einfach 30kg für das erste Paket ansetzen ist etwsa zu einfach. Wenn Du lauter Artikel mit 11kg verschickst, passt das nicht.

    Eine Methode zum optimalen Auffüllen der Pakete (die Größe muss man ja auch noch beachten) wäre mal Voraussetzung für alle weiteren Schritte.

    Falls Du wirklich perfekt aufteilen kannst, machst Du einfach ein Array, in dem für jedes paket das gewicht steht.
    Dann holst Du Dir in der Schleife das Gewicht und machst damit genau die Abfrage, die Du schon fertig hast.
    Den ermittelten Preis kannst Du dann auch in das Array eintragen.

    Am Schluss noch ausgeben und fertig....

    Einen Kommentar schreiben:


  • ThaRider
    antwortet
    Sind denn alle schon im Bett, oder hat keiner eine Idee?

    Ich bin nun schon soweit gekommen, das mir die Anzahl der benötigten Pakete angezeigt wird:
    PHP-Code:
    <?php
    // Maximales Gewicht pro Paket
    $maxgewicht="30";

    // Paketgewicht zum testen
    $gewicht="61";

    // Auf benötigte Pakete aufrunden
    $pakete=ceil($gewicht/$maxgewicht);


    // Paketanzahl ausgeben
    print 'Pakete: '.$pakete.'

    '
    ;

    // Pro Paket eine Zeile ausgeben
    for($i=1;$i<=$pakete;$i++)
    {
    print 
    'Paket '.$i.' :  ( ? kg )  =  ? EUR
    '
    ;
    }
    ?>

    Das ganze sieht dann so aus:
    Code:
    Pakete: 3
    
    Paket 1 : ( ? kg ) = ? EUR
    Paket 2 : ( ? kg ) = ? EUR
    Paket 3 : ( ? kg ) = ? EUR

    Wie man sieht, fehlt mir nun noch das Gewicht pro Paket und die dazugehörigen Versandkosten. Und genau an dieser Stelle weiß ich nun nicht weiter, wie ich da vorgehen könnte.

    Ich bräuchte nun eine Möglichkeit (Funktion) um das Gewicht der jeweiligen Pakete berechnen zu lassen und dazu müsste dann aus meiner MySql-Tabelle noch der passende Betrag geholt werden.


    Aussehen sollte das ganze dann so:
    Code:
    Paket 1 : ( 30 kg ) = 8.00 EUR
    Paket 2 : ( 30 kg ) = 8.00 EUR
    Paket 3 : ( 1 kg ) = 4.50 EUR

    Einen Kommentar schreiben:


  • ThaRider
    antwortet
    Zitat von DiBo33
    Irgendwie scheint wohl die Logik von MySql nen Schlag zu haben !!!
    Nein, deine.
    Aalso von vorne.

    select price from shop_shipping_costs where weight >= '1.00'

    heisst, der erste Datensatz dessen Bedingung zutrifft ist weight = 3.00
    3.00 ist grösser/gleich 1.00
    0.01 ist ist nicht grösser/gleich sondern kleiner als 1.00 somit trifft die Bedingung nicht zu!

    setze den Wert 0.01 in der Tabelle (wie sie vorher war) auf 0.00 und den letzten mindestens auf den maximal möglichen, dann lautet deine Bedingung

    WHERE weight <= Wert ORDER BY weight DESC LIMIT 1

    das ORDER BY ist dann nötig, da du sonnst immer den ersten price bekommst.

    [edit]nicht <= sondern <[/edit]

    Ich danke dir wirklich vielmals für deine Hilfe!

    Nun stehe ich aber schon vor dem nächsten, für mich zur Zeit, unlösbaren Problem. Und zwar ist das maximale Gewicht pro Paket 30.00 kg und ich möchte, wenn dieses Gewicht überschritten wird alle Artikel auf ein weiteres Paket aufteilen.

    Ich stelle mir dies so vor:
    -----------------------------
    1. Paket > 30 kg , dann -> 2. Paket
    2. Paket > 30 kg , dann -> 3. Paket
    usw.

    Die dazugehörigen Versandkosten müssten natürlich für jedes weitere Paket, entsprechend dem Paketgewicht, wieder aus der Datenbank geholt werden.

    Dies müsste man doch eigentlich lösen können, oder?

    Einen Kommentar schreiben:


  • DiBo33
    antwortet
    Irgendwie scheint wohl die Logik von MySql nen Schlag zu haben !!!
    Nein, deine.
    Aalso von vorne.

    select price from shop_shipping_costs where weight >= '1.00'

    heisst, der erste Datensatz dessen Bedingung zutrifft ist weight = 3.00
    3.00 ist grösser/gleich 1.00
    0.01 ist ist nicht grösser/gleich sondern kleiner als 1.00 somit trifft die Bedingung nicht zu!

    setze den Wert 0.01 in der Tabelle (wie sie vorher war) auf 0.00 und den letzten mindestens auf den maximal möglichen, dann lautet deine Bedingung

    WHERE weight <= Wert ORDER BY weight DESC LIMIT 1

    das ORDER BY ist dann nötig, da du sonnst immer den ersten price bekommst.

    [edit]nicht <= sondern <[/edit]

    Einen Kommentar schreiben:


  • ThaRider
    antwortet
    Zitat von DiBo33
    Das sind IMMER noch >0.01 !!!!!

    so langsam fühle ich mich vera****

    Wieso denn das?

    Kann doch nun auch nichts dafür, das es jetzt mit der erweiterten Tabelle funktioniert und vorher nicht funktioniert hat!

    Irgendwie scheint wohl die Logik von MySql nen Schlag zu haben !!!

    Anders kann ich mir das auch nicht erklären.

    Einen Kommentar schreiben:


  • DiBo33
    antwortet
    1.0 > 0.01 && < 2.99

    Einen Kommentar schreiben:


  • DiBo33
    antwortet
    Zitat von ThaRider
    Zitat von DiBo33
    Dann extrahiere deine Gesamtabfrage in einzelne Schritte und erstelle entsprechende Debuggingausgaben, ob denn wirklich auch die erwartende Werte gegeben sind.

    Bringt wohl auch nichts, denn:
    ----------------------------------
    Code:
    select price from shop_shipping_costs where weight >= '1.00'
    ist wohl korrekt.

    Es werden mir dennoch 5.00 EUR anstatt 4.50 EUR angezeigt.

    Hat denn keiner eine Idee, wie man es besser lösen könnte?
    Das sind IMMER noch >0.01 !!!!!

    so langsam fühle ich mich vera****

    Einen Kommentar schreiben:


  • ThaRider
    antwortet
    Zitat von DiBo33
    Dann extrahiere deine Gesamtabfrage in einzelne Schritte und erstelle entsprechende Debuggingausgaben, ob denn wirklich auch die erwartende Werte gegeben sind.
    Habs jetzt endlich raus!
    Musste meine Tabelle um ein paar Werte erweitern, aber Hauptsache es funktioniert nun.


    Meine MySql-Tabelle jetzt:
    ------------------------------

    weight | price
    ---------------
    0.01 | 4.50
    2.99 | 4.50
    3.00 | 5.00
    4.99 | 5.00
    5.00 | 5.50
    7.99 | 5.50
    8.00 | 6.00
    9.99 | 6.00
    10.00 | 6.50
    14.99 | 6.50
    15.00 | 6.50
    19.99 | 6.50
    20.00 | 7.00
    24.99 | 7.00
    25.00 | 7.50
    29.99 | 7.50
    30.00 | 8.00

    Einen Kommentar schreiben:


  • Der_Gerhard
    antwortet
    Evtl. könntest Du ja mit einer kleinen Redundanz leben und einfach pro Zeile die Unter- und Obergrenze eintragen.
    Dann trifft sicher nur eine Zeile zu oder gar keine wenn das Paket zu schwer ist.

    Einen Kommentar schreiben:


  • ThaRider
    antwortet
    Zitat von DiBo33
    Dann extrahiere deine Gesamtabfrage in einzelne Schritte und erstelle entsprechende Debuggingausgaben, ob denn wirklich auch die erwartende Werte gegeben sind.

    Bringt wohl auch nichts, denn:
    ----------------------------------
    Code:
    select price from shop_shipping_costs where weight >= '1.00'
    ist wohl korrekt.

    Es werden mir dennoch 5.00 EUR anstatt 4.50 EUR angezeigt.

    Hat denn keiner eine Idee, wie man es besser lösen könnte?

    Einen Kommentar schreiben:


  • DiBo33
    antwortet
    Dann extrahiere deine Gesamtabfrage in einzelne Schritte und erstelle entsprechende Debuggingausgaben, ob denn wirklich auch die erwartende Werte gegeben sind.

    Einen Kommentar schreiben:


  • ThaRider
    antwortet
    Zitat von DiBo33
    Ergibt genau das selbe Ergebnis, nämlich 5.00 EUR, obwohl es 4.50 EUR sein müssten.
    Lt. deiner Tabelle aber nicht

    weigt 0.01 price 4.50

    und lt. Adam Riese und mir ist 1.00 > 0.01

    Das ist wirklich mehr als komisch, aber anscheinend sehen wohl wir beide den Wald vor lauter Bäumen nicht.

    Also hier nochmal meine Abfrage:
    PHP-Code:
    <?php
    $checkshipping
    =mysql_fetch_array(mysql_query("select price from shop_shipping_costs where weight >= '$basket[3]' order by weight "));
    ?>
    Bei einem Gewicht von 4.00 kg bekomme ich momentan Versandkosten von 5.50 EUR angezeigt, es sollten jedoch lt. meiner Tabelle 5.00 EUR sein.
    Irgendwo steckt da der Wurm drin, vielleicht hab ich ja auch einen Designfehler in der Tabelle?

    Einen Kommentar schreiben:

Lädt...
X