Matthias: Mengen aus einer Zahl

Guten Tag,

ich habe folgendes Scenario:
Es geht um die Verrechnung von Tauchgaengen in einem Tauchshop.
Dort werden zum einen einzelne Tauchgaenge, als auch spezielle
Pakete angeboten.

In etwa wie folgt:
1 Tauchgang = 10 eur
10 " = 90 eur
20 " = 180 eur
30 " = 270 eur
etc..

Jetzt habe ich die Anzahl der Tauchgaenge eines Kunden.
Angenommen er hat 47 mal getaucht. So soll es wie folgt berechnet werden:

  • 1 Paket á 30 Tauchgaenge (270 eur)
  • 1 10er Paket (90 eur)
  • 7 einzelne Tauchgaenge (70 eur)
    In dem Beispiel waere der Preis fuer die 47 Tauchgaenge also bei 430 eur.

Nun meine Frage, wie ich am Besten die Funktion schreibe, die mir das
dynamisch berechnen kann. Habe es bisher mit dem Modulus probiert - kam
damit allerdings nicht viel weiter und stehe daher grade ein wenig auf
dem Schlauch.

Waere nett, wenn mir einer mal einen kleinen Denkanstoss geben koennte.

Danke,
Matthias

  1. Guten Tag,

    also ich habe jetzt eine Loesung gefunden:

      
    <?  
      
    $pkg = array();  
    $pkg[0] = 50;  
    $pkg[1] = 40;  
    $pkg[2] = 30;  
    $pkg[3] = 25;  
    $pkg[4] = 20;  
    $pkg[5] = 10;  
    $pkg[6] = 5;  
      
    calculate(87,$pkg);  
      
    function calculate($dives,$pkgs)  
    {  
     foreach($pkgs as $value)  
     {  
      if($dives>=$value)  
      {  
       $dives_left = $dives-$value;  
       echo "<br>1 Package á ".$value." Dives";  
       return calculate($dives_left,$pkgs);  
      }  
     }  
     echo "<br>$dives single Dives";  
    }  
      
    ?>  
    
    

    Ausgabe:
    1 Package á 50 Dives
    1 Package á 30 Dives
    1 Package á 5 Dives
    2 single Dives

    Gibt es daran irgendetwas auszusetzen?

    mfg
    Matthias

    1. Hi,

      Gibt es daran irgendetwas auszusetzen?

      Probier mal calculate(400,$pkg);

      Für das größte Paket mußt Du gucken, wie oft das reinpaßt.
      Für die kleineren Pakete ist das _in deinem speziellen Fall_ nicht nötig, weil die restlichen Pakete zufällig nicht mehr als einmal in das jeweils nächstgrößere Paket passen.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallo Andreas,

        Gibt es daran irgendetwas auszusetzen?

        Probier mal calculate(400,$pkg);

        Das fuehrt bei mir zu folgendem Ergebnis:
        1 Package á 50 Dives
        1 Package á 50 Dives
        1 Package á 50 Dives
        1 Package á 50 Dives
        1 Package á 50 Dives
        1 Package á 50 Dives
        1 Package á 50 Dives
        1 Package á 50 Dives
        0 single Dives

        Also 8 x das 50er Paket. So ist es ja richtig.

        Für die kleineren Pakete ist das _in deinem speziellen Fall_ nicht nötig, weil die restlichen Pakete zufällig nicht mehr als einmal in das jeweils nächstgrößere Paket passen.

        Gluecklicherweise ;)

        mfg
        Matthias

        1. Hi,

          Das fuehrt bei mir zu folgendem Ergebnis:
          1 Package á 50 Dives
          1 Package á 50 Dives
          1 Package á 50 Dives
          1 Package á 50 Dives
          1 Package á 50 Dives
          1 Package á 50 Dives
          1 Package á 50 Dives
          1 Package á 50 Dives
          0 single Dives

          Also 8 x das 50er Paket. So ist es ja richtig.

          Ich hielte folgendes für sinnvoller:

          8 Packages á 50 Dives
          0 single Dives

          Und das rekursiv zu lösen, ist m.E. auch nicht sinnvoll.

          Abgesehen davon, das französische "á" wird zwar bei uns benutzt, in der englischen Sprache ist m.W. aber eher "of" üblich.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. echo $begrüßung;

            Abgesehen davon, das französische "á" wird zwar bei uns benutzt, in der englischen Sprache ist m.W. aber eher "of" üblich.

            Außerdem ist es à statt á.

            echo "$verabschiedung $name";

            1. Hallo,

              Jungs, das war doch nur ein Beispiel ;-)
              Es findet keine Ausgabe statt.

              mfg
              Matthias

  2. Hallo Matthias,

    Angenommen er hat 47 mal getaucht. So soll es wie folgt berechnet werden:

    • 1 Paket á 30 Tauchgaenge (270 eur)
    • 1 10er Paket (90 eur)
    • 7 einzelne Tauchgaenge (70 eur)
      In dem Beispiel waere der Preis fuer die 47 Tauchgaenge also bei 430 eur.

    oops,
    da wird IMHO der Kunde aber sehr sauer werden.

    Der einzelne Tauchgang kostet 10 Euro
    ab 10 Tauchgängen gibt es Rabatt, also 9 Euro.
    Der Kunde hat 47 Tauchgaenge, 47 ist größer als 9, also 47 * 9 = 423 Euro
    Und als Funktion:

    <?php  
    function get_preis($anzahl) {  
        return ($anzahl > 9) ? $anzahl * 9 : $anzahl * 10;  
    }  
      
    /* Beispiel */  
      
    $TG = array(1,3,5,7,9, 11, 13, 15, 17, 19);  
    foreach($TG as $tauchg) {  
        echo 'Tauchgänge:'.sprintf('% 3s',$tauchg).' = '.sprintf('% 5s', get_preis($tauchg))." &euro\n";  
    }  
    ?>
    

    Also:
    Warum einfach, wenn es auch kompliziert geht ... ;-)

    m.b.G. Rolf

    1. Guten Tag Rolf!

      da wird IMHO der Kunde aber sehr sauer werden.

      Die Regeln macht natuerlich der Diveinstructor - nicht ich. Von daher soll mich das nicht weiter stoeren ;-)

      Der einzelne Tauchgang kostet 10 Euro
      ab 10 Tauchgängen gibt es Rabatt, also 9 Euro.

      Das ist anders zu verstehen. Es ist nicht so, dass man einfach drauf los taucht und nachher schaut, wieviele Tauchgaenge man gemacht hat, sondern man muss vorher einen Tauchgang - oder eben ein Paket - bestellen. Andere, weitere Tauchgaenge, die nach Ablauf des Paketes gemacht werden, sind unabhaengig von den Vorherigen.

      mfg
      Matthias

      1. Hallo Matthias,

        wenn das so sein soll, wie Du jetzt angibst, dann kann man aus der Zahl 47
        niemals eineindeutig auf die Preisgruppen schliessen. Schlimmstenfalls hat
        der Kunde 47 Einzeltauchgänge absolviert und darf gar keinen Rabatt haben.

        Im Moment der Buchung sollte das Paket und sein Preis schon erfasst werden.
        Abschliessend werden offenen Buchungen ausgelesen und Preise addiert - fettisch.

        m.b.G. Rolf