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

  • #16
    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?

    Kommentar


    • #17
      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

      Kommentar


      • #18
        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....
        **********************************
        Nein, ich bin nicht die Signatur.
        Ich putze hier nur.
        **********************************

        Kommentar


        • #19
          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.

          Kommentar


          • #20
            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.
            **********************************
            Nein, ich bin nicht die Signatur.
            Ich putze hier nur.
            **********************************

            Kommentar


            • #21
              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?

              Kommentar


              • #22
                Zitat von ThaRider
                Eine einfachere Lösung gibt es ganz sicher nicht?
                Wenn Du eine findest, kannst Du sie uns ja mitteilen.

                Das Problem ähnelt dem bei der dynamischen Speicherverwaltung: Verschieden große Blöcke sollen optimal im Speicher angelegt werden. Ein eindeutig bestes Verfahren dazu ist mir nicht bekannt. Alle haben irgendwelche Schwächen.

                Es gibt auch eine Ähnlichkeit zum sog. Rucksackproblem, auf dessen Basis früher einmal ein Verschlüsselungsverfahren entwickelt wurde.

                Daher würde ich mir jetzt keine allzu große Hoffnung machen, eine wirklich triviale und einfache Lösung zu finden.

                Ich hab mich aber schon sehr lange nicht mehr mit solchem Zeugs beschäftigt. Vielleicht übersehe ich ja ein wichtiges Detail, das die Sache einfacher werden lässt.
                **********************************
                Nein, ich bin nicht die Signatur.
                Ich putze hier nur.
                **********************************

                Kommentar


                • #23
                  Zitat von Der_Gerhard
                  Zitat von ThaRider
                  Eine einfachere Lösung gibt es ganz sicher nicht?
                  Wenn Du eine findest, kannst Du sie uns ja mitteilen.

                  Das Problem ähnelt dem bei der dynamischen Speicherverwaltung: Verschieden große Blöcke sollen optimal im Speicher angelegt werden. Ein eindeutig bestes Verfahren dazu ist mir nicht bekannt. Alle haben irgendwelche Schwächen.

                  Es gibt auch eine Ähnlichkeit zum sog. Rucksackproblem, auf dessen Basis früher einmal ein Verschlüsselungsverfahren entwickelt wurde.

                  Daher würde ich mir jetzt keine allzu große Hoffnung machen, eine wirklich triviale und einfache Lösung zu finden.

                  Ich hab mich aber schon sehr lange nicht mehr mit solchem Zeugs beschäftigt. Vielleicht übersehe ich ja ein wichtiges Detail, das die Sache einfacher werden lässt.
                  Könntest du mir denn auch vielleicht ein Beispiel geben, wie dann ein solches Array aufgebaut sein müsste? Das wäre wirklich sehr nett von dir!

                  Kommentar


                  • #24
                    Hätte da nochmal eine Frage dazu. Und zwar nehmen wir mal an, es soll nicht wirklich passend gemacht werden, sondern nur die anzahl der benötigten Pakete und dazu das Gewicht für jedes Paket ermittelt werden, dann müsste dies doch einfacher zu lösen sein, oder nicht?


                    Beispiel:
                    ----------
                    Code:
                    Gesamtgewicht aller Artikel = 61 kg
                    max. Gewicht pro Paket = 30 kg
                    
                    Und nun einfach die Pakete und das dazugehörige Gewicht ausgeben, in diesem Fall dann also 3 Pakete.
                    Paket 1 = 30kg
                    Paket 2 = 30kg
                    Paket 3 = 1kg

                    Kommentar


                    • #25
                      Wenns dir wirlich egal ist

                      PHP-Code:
                      <?php
                      $max_weight 
                      30;
                      $ges_weight 61;
                      $anz_pakete ceil($ges_weight/$max_weight);
                      $rest = ($ges_weight%$max_weight)?$ges_weight%$max_weight:$max_weight;
                      $pakete = array();
                      for (
                      $i=0$i<$anz_pakete-1$i++) $pakete[$i]=$max_weight;
                      $pakete[$anz_pakete-1]=$rest;
                      print_r($pakete);
                      ?>
                      [edit]kleine Korrektur[/edit]

                      Kommentar


                      • #26
                        Zitat von DiBo33
                        Wenns dir wirlich egal ist

                        PHP-Code:
                        <?php
                        $max_weight 
                        30;
                        $ges_weight 61;
                        $anz_pakete ceil($ges_weight/$max_weight);
                        $rest = ($ges_weight%$max_weight)?$ges_weight%$max_weight:$max_weight;
                        $pakete = array();
                        for (
                        $i=0$i<$anz_pakete-1$i++) $pakete[$i]=$max_weight;
                        $pakete[$anz_pakete-1]=$rest;
                        print_r($pakete);
                        ?>
                        [edit]kleine Korrektur[/edit]

                        Mit deinem zuerst geposteten Code gings auch. Was ist hier jetzt der entscheidende Unterschied zum ersten Code?

                        So sieht das ganze nun bei mir aus:
                        PHP-Code:
                        <?php
                        // Ausrechnen der Paketanzahl und des Gewichts pro Paket
                        $max_weight 30;
                        $ges_weight 69;
                        $anz_pakete ceil($ges_weight/$max_weight);
                        $pakete = array();
                        for (
                        $i=1$i<=$anz_pakete$i++) $pakete[$i]=$max_weight;
                        $pakete[$anz_pakete]=$ges_weight%$max_weight;
                        print_r($pakete);
                        print 
                        '

                        '
                        ;
                        //Je nach Paketanzahl 1 Zeile pro Paket ausgeben und vorher die entsprechenden Versandkosten aus der Datenbank holen
                        for($i=1;$i<=$anz_pakete;$i++)
                        {
                        $shipping=mysql_fetch_array(mysql_query("select price from shop_shipping_costs where weight <= '$pakete[$i]' order by weight desc limit 1"));
                        print 
                        'Paket '.$i.' :  ( '.$pakete[$i].' kg )  =  '.$shipping[0].' EUR
                        '
                        ;
                        }
                        ?>
                        für Verbesserungsvorschläge bin ich offen

                        Kommentar


                        • #27
                          Was ist hier jetzt der entscheidende Unterschied zum ersten Code?
                          Gebe mal in $ges_weight ein Wert welcher direkt durch $max_weight teilbar ist ein.

                          Kommentar


                          • #28
                            Zitat von DiBo33
                            Was ist hier jetzt der entscheidende Unterschied zum ersten Code?
                            Gebe mal in $ges_weight ein Wert welcher direkt durch $max_weight teilbar ist ein.
                            Okay, dann ist das Gewicht des Pakets 0,00 kg.

                            Kommentar


                            • #29
                              Ich danke dir vielmals für deine wirklich sehr gute Arbeit.
                              Das ist eigentlich genau das, was ich gesucht habe.

                              Kommentar


                              • #30
                                Wenn Du nicht weißt, was tatsächlich in ein Paket passt, weißt Du auch nicht, wieviele Pakete Du brauchst!
                                **********************************
                                Nein, ich bin nicht die Signatur.
                                Ich putze hier nur.
                                **********************************

                                Kommentar

                                Lädt...
                                X