Ankündigung

Einklappen
Keine Ankündigung bisher.

Exponentielle Kombination von Wertpaaren

Einklappen

Neue Werbung 2019

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

  • Exponentielle Kombination von Wertpaaren

    Guten Morgen liebe Mitstreiter,

    ich habe im Online-Shop einen Varianten-Artikel. Der Kunde kann zwischen zwei Farben und drei Anhlüssen, also insgesamt 6 Varianten wählen:

    1:2 = Farbe: weiss
    1:17 = Farbe: schwarz

    2:3 = Anschluss parallel
    2:5 = Anschluss USB
    2:4 = Anschluss RS232

    Aus vorangestellten Wertpaaren sollen nun in die möglichen 6 Kombinationen erzeugt werden:

    1:2 + 2:3 = weiss, parallel,
    1:2 + 2:5 = weiss, USB
    1:2 + 2:4 = weiss, RS232

    1:17 + 2:3 = schwarz, parallel,
    1:17 + 2:5 = schwarz, USB
    1:17 + 2:4 = schwarz, RS232

    Dies ist nur ein einfaches Beispiel. Es gibt auch Artikel mit 8 x 4 Varianten.

    Ich hab mir die halbe Nacht die umme Ohren gehauen, komme aber nicht einmal ansatzweise in die Nähe einer Lösung. Vielleicht denke ich mal wieder viel zu kompliziert.

    Hat jemand von euch einen Lösung oder zumindest einen Denkanstoss für mich?

    Einen Dank im Voraus,
    Sascha

  • #2
    komme aber nicht einmal ansatzweise in die Nähe einer Lösung
    Lösung für was ???
    Machs eben über ne config als Textdatei und Arrays/foreach.

    Oder alle Variationen in der DB ablegen.

    Aber wie gesagt: ich weiß gar nicht für was Du ne Lösung suchst.

    Kommentar


    • #3
      Nehmen wir ein anderes anschaulicheres Beispiel:
      Ich habe Unmengen von Obst. Davon 2 verschiedene Apfelsorten und 3 verschiedene Birnensorten. Das Ziel: Ich muss jeweils einen Apfel und eine Birne in eine Kiste packen. Keine Kisten darf aber eine gleiche Apfel-/Birnen-Sorte enthalten.

      Kommentar


      • #4
        was verstehst Du daran nicht ?
        Machs eben über ne config als Textdatei und Arrays/foreach.

        Oder alle Variationen in der DB ablegen.
        PHP-Code:
        $aepfel = array('mostkopf''delicious');

        $birnen = array('hohlbirne''sparbirne''blitzbirne');

        $res = array();

        foreach(
        $aepfel as $key => $value){

           foreach(
        $birnen as $key1 => $value1){

              
        $res[] = array($value$value1);
           }
        }

        echo 
        '<pre>';
        print_r($res);
        echo 
        '</pre>'

        Kommentar


        • #5
          ähm... du meinst einfach verschachtelte Schleifen?
          die äußere nimmt deine Birnen
          die innere deine Äpfel...

          also ein kartesisches Produkt.

          Kommentar


          • #6
            nein - die Äpfel sind immer außen,
            nennt man auch das Äppelprinzip.

            Kommentar


            • #7
              Danke für das Codebeispiel Koala!

              Das ganze müsste allerdings rekursiv funktionieren, da es z.b. auch Varianten-Artikel mit bis zu zehn Varianten gibt. Und bei jeden Artikel sind das andere Varianten. Bei Druckern meist nur Farbe und Anschlussart. Bei Kassensystemen kommen noch etliche andere Optionen hinzu: mit/ohne Magnetkartenleser, HDD oder SSD, Hauptspeicher (4fach Auswahl), Kundendisplay, etc.

              Das liesse sich dann mit verschachteltem foreach vermutlich nicht lösen.

              Kommentar


              • #8
                Und wie wird das dann angeboten? Als Select? Das finde ich total furchtbar gelöst. Wieso nicht zwei Auswahlen für 2 Features? Das ist doch viel logischer, benutzerfreundlicher und schließlich auch flexibler, wenn es bspw. den schwarzen Drucker nicht mit Netzwerkanschluss gibt. Du scheinst schon jetzt eine Sackgasse zu betreten.

                Kommentar


                • #9
                  Ein Kunde kann sich im Shop z.B. diesen Varianten-Artikel nach seinen Bedürfnissen zusammenstellen:
                  http://kassen.net/hp-ap5000-allinone...-1-p-2526.html

                  Jede Eigenschaft (Ausstattung, Betriebssystem, Garantieoption) hat 2-3 wählbare Optionen. In diesem Fall gibt es 3 Eigenschaften mit insgesamt 8 Optionen = 24 Varianten. Jede Eigenschaft und jede Option hat eine ID in der Datenbank.

                  Im Backend versuche ich nun eine serialisierte Liste zu erzeugen, die die IDs aller 24 Varianten paarweise (Eigenschafts-ID:Options-ID) abbildet.

                  Kommentar


                  • #10
                    ein etwas unverständlicher Algo, Sonntag halt

                    PHP-Code:
                    <?php
                            
                     $apples
                    =array("boskop""jonagold""elstar""braeburn");
                     
                    $pears=array("helene""conference""rocha");
                     
                    $cars=array("ford""bmw""mercedes");
                     
                    $animals=array("baer""affe""eule");
                     
                     
                    $all = array($apples$pears$cars$animals);
                     
                     
                    $end=array();

                     function 
                    kartese ($a) {
                     
                        if(
                    count($a)>1){
                        
                            
                    $temp=array();
                            
                            foreach (
                    $a[0] as $v1
                                foreach (
                    $a[1] as $v2
                                    
                    $temp[]=$v1 " - " $v2;
                            
                            global 
                    $end;
                            
                    $end=$temp;
                            
                            if(!
                    is_array($a[2]))
                                return;

                            
                    $new_a = array();
                            
                    $new_a[]=$temp;

                            
                            for(
                    $y=2$y<count($a); ++$y) {
                                
                    $new_a[]=$a[$y];
                            }
                            
                            
                    kartese($new_a);
                        }
                     }
                     
                    kartese ($all);

                    foreach (
                    $end as $v)
                        echo 
                    $v "<br />";

                    ?>

                    Kommentar


                    • #11
                      nochmal die Rekursion rausgenommen... wollte eigentlich rekursiv arbeiten, habe mich dann aber verlaufen.

                      PHP-Code:
                      function kartese2 ($a) {
                       
                          while (
                      count($a)>1){
                          
                              
                      $temp=array();
                              
                              foreach (
                      $a[0] as $v1
                                  foreach (
                      $a[1] as $v2
                                      
                      $temp[]=$v1 " - " $v2;
                              
                              global 
                      $end;
                              
                      $end=$temp;
                              
                              if(!
                      is_array($a[2]))
                                  return;

                              
                      $new_a = array();
                              
                      $new_a[]=$temp;

                              
                              for(
                      $y=2$y<count($a); ++$y) {
                                  
                      $new_a[]=$a[$y];
                              }
                              
                              
                      $a $new_a;
                          }
                       } 

                      Kommentar


                      • #12
                        und nochmal anders: mit Rekursion
                        Aufruf diesmal ohne global.

                        PHP-Code:

                         $apples
                        =array("boskop""jonagold""elstar""braeburn");
                         
                        $pears=array("helene""conference""rocha");
                         
                        $cars=array("ford""bmw""mercedes");
                         
                        $animals=array("baer""affe""eule");
                         
                         
                        $all = array($apples$pears$cars$animals);

                        function 
                        kartese3($a$start) {
                            
                        $result = array();
                            if (
                        $start count($a)) {
                                foreach (
                        $a[$start] as $i) {
                                    
                        $temp kartese3($a$start 1);
                                    if (
                        count($temp) > 0)
                                        foreach (
                        $temp as $item
                                            
                        $result[] = $i " - " $item;                
                                    else
                                        
                        $result[] = $i;
                                }
                            }
                            return 
                        $result;
                        }

                        $end kartese3($all0);

                        foreach (
                        $end as $v)
                            echo 
                        $v "<br />"

                        Kommentar


                        • #13
                          Das liesse sich dann mit verschachteltem foreach vermutlich nicht lösen.
                          ja - setz das mit Ajax um,
                          nach jeder Auswahl folgt ggf. eine weitere Auswahl.
                          Also if und foreach statt nur foreach.

                          Kannst Dir vorstellen wie bei einem Bestellvorgang mit Step1, Step2 usw.

                          Alle Konfigurationen in ein einziges Schema pressen zu wollen
                          wird wohl nicht gehn, da die Zusammenstellungen zu unterschiedlich sind,
                          zu sehr variieren.

                          Bei so Sachen wie "mit/ohne Magnetkartenleser" brauchst eh kein Array,
                          da reicht ein simples ja/nein - BOOLEAN.

                          Kommentar


                          • #14
                            Wenn du eine SQL Datenbank baust, in der alle Features eigene Tabelle haben in denen dann die einzelnen Ausprägungen der jeweiligen Features gelistet sind, kannst du dein Ziel erreichen, indem du die Tabellen, die die benötigten Features darstellen mit den einzelnen Produkten aus einer Produkttabelle joinst.
                            Bsp: SELECT produkte.* FROM produkte JOIN farben JOIN steckersysteme WHERE produkte.id=1;

                            Kommentar

                            Lädt...
                            X