kostenloser Webspace werbefrei: lima-city


Vergleichs-PHP-Script

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    decarabia

    decarabia hat kostenlosen Webspace.

    Hi,
    Nachdem ich nun nicht gerade freundlich in einem PHP-Forum empfangen wurde, der selbe Post hier. In der Hoffnugn das ich hier vernünftige Hilfe bekomme.

    also ich bin ein Anfänger, das mal vorne weg - ich hab zwar nicht 0 Ahnung aber annährend), aber das sind soviele ifs und elseifs das ich keinen Überblick mehr bekomme (und es werden wohl noch mehr werden).

    Ich habe 2008 mit einem Bekannten angefangen zu programmieren - ich sagte ihm wie was funktionieren muss, er setzte es um. Mitte 2009 hatten wir ein funktionierendes Script. Nur dann verschwand er - und auch der Server auf dem das Script lief - und ich Depp hatte natürlich nicht sofort nen Save davon gemacht, sondern hatte noch ne ältere Version auf dem PC. Diese ältere Version läuft nicht einbandfrei. Im Prinzip tut das Script nichts anderes, als die Eingabe zusammen zu setzen, Fehler bei der Eingabe beheben, die Eingabe so angleichen das die vergleicht werden kann, und dann vergleichen - und das ganze sensibel auf Groß und Kleinschreibung.

    Der größte batzen ist es die Eingabe anzugleichen - und hier gibts noch 2 Fehler, die mir auf anhieb einfallen (bestimmt nicht die einzigsten).

    Also das Script erreichnet für Farbratten, welche Farben in den Würfen fallen - im Calc sind ca. 240 Farben, und ist noch nicht vollständig - aber das ist das kleinste Problem (das kann ich selbst problemlos beheben). So sieht es aktuell aus: http://decarabia.4lima.de/genetik/eingabe.php (sonst könnt ihr glaube ich garkeine Verständnis zur Funktionsweise bekommen - dadran saß ich nämlich früher mit meinen Bekannten am längsten).

    Wenn man nun aber bei dem Muttertier oben(Dropdownmenü) Black stehn lässt und in den Checkboxen Mink & Pearl makiert, und beim Vater Mink auswählt (egal ob nun Dropdownmenü oder Checkbox), müsste er bei aa Mm PEpe Black anzeigen, das Mm filtert er sauber raus - das PEpe darf er aber nur rausfiltern wenn Mm oder MM gegeben ist - bei aa mm PEpe muss die Farbe Pearl angezeigt werden (macht er ja auch). Aktuell filtert er PEpe nicht raus, wenn Mm oder MM gegeben ist, und das selbe noch mal mit MOmo und MOMO. Das ist das einfachere Problem (denke das schwerere ist sinnvoll zu beheben, wenn das Problem nimmer da ist). Das kann ich leider nicht lösen - ich hab nicht mal mehr ein Peil wo ich das sinnvoll einbauen könnte in diesen Koloss.
    Ich habe nur bei den ganzen überhaupt kein Plan mehr wo ich das angeben soll und überhaupt.

    Das dieser Stelle müssten nun knapp 500 Zeilen Code folgen, damit man sich überhaupt ein Überblick verschaffen kann, wie das Script arbeitet. Also geb ich nun an, wo ich das ganze einsetzen würde... bzw womit ich für mein Verständis die schwierigkeiten habe:



    include("functions.php");
         $ausgabe = array();
    
         $genetik_mutter = getGenetikInfo($_REQUEST['mutter'],$_REQUEST['farbe_mutter']);
         $genetik_vater = getGenetikInfo($_REQUEST['vater'],$_REQUEST['farbe_vater']);
        
         $tmp_mutter = explode(" ",$genetik_mutter);
         $tmp_vater = explode(" ",$genetik_vater);
         $d = 0;
         $found_gens = array();
         for ($i = 0; $i < sizeof($tmp_mutter); ++$i){
          
          switch(strtolower($tmp_mutter[$i])){
            case "chc":
              $found_gens[] = "chch";
              $found_gens[] = "cc";
              $found_gens[] = strtolower($tmp_mutter[$i]);
              if(array_search("chc",array_map("strtolower",$tmp_vater)) === false && array_search("cc",array_map("strtolower",$tmp_vater)) === false && array_search("chch",array_map("strtolower",$tmp_vater)) === false){
                $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".strtoupper($tmp_mutter[$i]));
                
              }else{
                if(array_search("chc",array_map("strtolower",$tmp_vater)) !== false){
                  $key = array_search("chc",array_map("strtolower",$tmp_vater));
                  $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".$tmp_vater[$key]);
                }elseif(array_search("cc",array_map("strtolower",$tmp_vater)) !== false){
                  $key = array_search("cc",array_map("strtolower",$tmp_vater));
                  $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".$tmp_vater[$key]);         
                }elseif(array_search("chch",array_map("strtolower",$tmp_vater)) !== false){
                  $key = array_search("chch",array_map("strtolower",$tmp_vater));
                  $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".$tmp_vater[$key]);         
                }
              }
              $d++;
              break;
            default:
              $found_gens[] = strtolower($tmp_mutter[$i]);
              //echo strtolower($tmp_mutter[$i])."<br>";
              if(strtolower($tmp_mutter[$i]) == "cc" && array_search("chch",array_map("strtolower",$tmp_vater)) !== false){
                $key2 = array_search("chch",array_map("strtolower",$tmp_vater));
                $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".$tmp_vater[$key2]);
                $found_gens[] = "chc";
                $found_gens[] = "chch";
                $found_gens[] = "cc";
              }elseif(strtolower($tmp_mutter[$i]) == "cc" && array_search("chc",array_map("strtolower",$tmp_vater)) !== false){
                $key2 = array_search("chc",array_map("strtolower",$tmp_vater));
                $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".$tmp_vater[$key2]);
                $found_gens[] = "chc";
                $found_gens[] = "chch";
                $found_gens[] = "cc";
              }elseif(strtolower($tmp_mutter[$i]) == "chch" && array_search("cc",array_map("strtolower",$tmp_vater)) !== false){
                $key2 = array_search("cc",array_map("strtolower",$tmp_vater));
                $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".$tmp_vater[$key2]);
                $found_gens[] = "chc";
                $found_gens[] = "chch";
                $found_gens[] = "cc";
              }elseif(strtolower($tmp_mutter[$i]) == "chch" && array_search("chc",array_map("strtolower",$tmp_vater)) !== false){
                $key2 = array_search("chc",array_map("strtolower",$tmp_vater));
                $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".$tmp_vater[$key2]);            
                $found_gens[] = "chc";
                $found_gens[] = "chch";
                $found_gens[] = "cc";
              }else{
                if(array_search(strtolower($tmp_mutter[$i]),array_map("strtolower",$tmp_vater)) !== false){
                  $key =  array_search(strtolower($tmp_mutter[$i]),array_map("strtolower",$tmp_vater));
                  $ausgabe[$d] = multiply($tmp_mutter[$i],$tmp_vater[$key]);
                }elseif(strtolower($tmp_mutter[$i]) == "bebe" || strtolower($tmp_mutter[$i]) == "pepe" || strtolower($tmp_mutter[$i]) == "bubu"){
                  $ausgabe[$d] = multiply($tmp_mutter[$i],strtolower($tmp_mutter[$i]));
                }else{
                  $ausgabe[$d] = multiply($tmp_mutter[$i],strtoupper($tmp_mutter[$i]));
                }
              }
              $d++;
              break;
          }
          
        }



    Danach folgt das selbe, nur statt mutter immer mit dem Vater an der Stelle. Wie man sieht wird noch eine Datei included, damit die Datei nicht zu unübersichtlich wird (haha... hilft mir auch nicht).

    Das 2te, größere Problem ist die herausfilterung von BUbu, BUBU, BEbe, BEBE wenn Cc, CC, CHc, CHC, CHCH, CHch gegeben wäre. Aber das machen wir danch getrennt? Ich überlass es euch

    Also es soll nicht generell rausgefiltert werden, sonder nur für den nötig Vergleich (sonst kann er in der Ausgabe nie und nimmer anzeigen, welche Farbe welcher Gencode hat!).

    Ich hoffe das mir wer hier sinnvoll helfen kann.. im idealfall so das ich es verstehe.
    LG, Andrea
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hi Andrea,
    Es hat, glaube ich, weniger Sinn, Dir im Einzelnen zu erklären, wie das jetzige Script arbeitet, damit Du dann noch mehr "Sonderfälle" damit behandeln kannst. So, wie das Script jetzt schon dasteht, ist es, wie Du selbst sagst, recht unübersichtlich. Und nachdem ich gesehen, habe, wie fast derselbe Code dreimal wiederholt wird,
    ...
              }elseif(strtolower($tmp_mutter[$i]) == "cc" && array_search("chc",array_map("strtolower",$tmp_vater)) !== false){
                $key2 = array_search("chc",array_map("strtolower",$tmp_vater));
                $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".$tmp_vater[$key2]);
                $found_gens[] = "chc";
                $found_gens[] = "chch";
                $found_gens[] = "cc";
              }elseif(strtolower($tmp_mutter[$i]) == "chch" && array_search("cc",array_map("strtolower",$tmp_vater)) !== false){
                $key2 = array_search("cc",array_map("strtolower",$tmp_vater));
                $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".$tmp_vater[$key2]);
                $found_gens[] = "chc";
                $found_gens[] = "chch";
                $found_gens[] = "cc";
              }elseif(strtolower($tmp_mutter[$i]) == "chch" && array_search("chc",array_map("strtolower",$tmp_vater)) !== false){
                $key2 = array_search("chc",array_map("strtolower",$tmp_vater));
                $ausgabe[$d] = multiplyhimas($tmp_mutter[$i]."/".$tmp_vater[$key2]);            
                $found_gens[] = "chc";
                $found_gens[] = "chch";
                $found_gens[] = "cc";
              }else 
    ...
    glaube ich umso mehr, dass ein "rewrite" die bessere Lösung wäre. Es ist nicht unüblich (und ist mir auch schon des öfteren passiert), dass man einen anfangs gewählten Weg irgendwann einfach wieder verlassen und das ganze neu aufziehen muss. Du solltest Dir, unabhängig von konkreten Farbwerten den eigentlichen Algorithmus (=das Regelwerk) klarmachen, der vererbungstechnisch greift. Leider habe ich davon keine Ahnung (ich kenne nur noch "rezessive" und "dominante" Gene ...). Aber, wenn es Dir gelingt, dieses Regelwerk unabhängig von konkreten Farbwerten aufzubauen, brauchst Du es später nur noch mit Deinen konkreten Farben (und ihren spezifischen Eigenschaften, wie "dominant"/"rezessiv" oder was auch immer) zu füttern. Die Farbdaten selbst können dann in einer übersichtlichen Struktur, vielleicht sogar in einer oder mehreren Datenbanktabellen gehalten werden. Eine Erweiterung ist dann sehr einfach und das ganze läßt sich dann wahrscheinlich auch einfacher auf andere Nagetiere anpassen.

    Vielleicht kannst Du die Regeln ja tatsächlich ine "einfachen Worten" beschreiben? Das wäre schon mal ein guter Anfang! (Dein Beispiel mit den Abkürzungen habe ich so leider noch nicht verstanden... vielleicht fehlen da aber auch nur noch ein paar Definitionen?)

    [hr]
    Habe mir Deine eingabe.php-Seite noch einmal angesehen. Daraus ist ersichtlich, wie sich unterschiedliche Farben als Ergebnis von bestimmten Genkombinationen (1 bis 5 Gene) ergeben. Diese "Farbtabelle" solltest Du in einer Datenbankstruktur (drei Tabellen) hinterlegen. Hier ein paar mögliche Tabellendefinition:
    -- Tabelle der Erscheinungstypen (der "gemischten" Farben)
    CREATE TABLE phaenotyp (phaenid int auto_increment primary key, farbname varchar(128));
    -- Tabelle der einzelnen Gene (getrennte Einträge für MOmo und MOMO in Spalte gencode)
    -- wichtig: COLLATE  latin1_general_cs für Spalte gencode!
    CREATE TABLE gene (genid int auto_increment primary key, gencode varchar(8) COLLATE latin1_general_cs , genname varchar(64))
    -- Tabelle der Genkombinatinen (es können n Gene zu einem Phaenotyp zusammenkommen)
    CREATE TABLE combi (pid int,gid int, UNIQUE (pid,gid))
    Nachdem Du die Basisgene wie folgt eingeben hast:
    insert into gene (gencode,genname) VALUES
    ('AA','Black'),
    ('aa','Agouti'),
    ('Aa','Black?'),
    ('BB','Chocolate'),
    ('Bb','Schoko'),
    ('bb','Kakao'),
    ('dd','english Blue')
    -- usw. ...
    kannst Du die Farbkombinationen wie folgt definieren:
    -- zuerst die Namenseinträge in phaenotyp:
    INSERT INTO phaenotyp (farbname) VALUES
    ('Black'),('Agouti'),('Chocolate'),('Cinnamon Chac based'),('Classic Lilac'),('Classic Lilac Agouti')
    -- dann die erforderlichen Gene zusammensuchen ...
    INSERT INTO combi VALUES
    (1,2),
    (2,1),
    (3,2),
    (3,6),
    (4,1),
    (4,6),
    (5,2),
    (5,6),
    (5,7),
    (6,1),
    (6,6),
    (6,7)
    Wenn Du so mit allen genen und Farbkombinationen verfährst, hast Du hinterher ein genaues Abbild der Zusmmenhänge in einer strukturierten Datenbank und Du kannst über (relativ) einfache Abfragen erfahren, welche Gene zu einer bestimmten Farbzusammensetzung gehören
    select farbname,gencode,genname from phaenotyp 
      inner join combi on pid=phaenid 
      inner join gene on genid=gid
    WHERE farbname='classic lilac'
    ergibt die folgendes:
    farbname        gencode   genname
    --------------------------------------  
    Classic Lilac   aa        Agouti 
    Classic Lilac   bb        Kakao 
    Classic Lilac   dd        english Blue
    oder welches Erscheinungsbild bei einer bestimmten Genkombination entstehen wird:
    select * from phaenotyp
     where phaenid in 
      (select pid from combi inner join gene on genid=gid where gencode='aa')
     AND phaenid in 
      (select pid from combi inner join gene on genid=gid where gencode='bb')
     AND phaenid in 
      (select pid from combi inner join gene on genid=gid where gencode='dd')
    ergibt:
    phaenid     farbname 
    -------------------------
    5           Classic Lilac
    Die SQL-Abfrage würde in Deinem PHP-Script natürlich je nach Anzahl der beiteiligten Gene "mechanisch" zusammengebaut werden. (Die Abfrage ist so auch noch nicht ganz komplett, denn im Moment würde sie auch noch Farben liefern, die zu ihrer Entstehung die oben aufgeführten, aber darüberhinaus noch weitere Gene benötigen!). Grundsätzlich hätest Du damit aber die wesentliche Logik in den Bereich der Datenbank verbannt und keine verwirrenden if und esle-if Konstrukte mehr in Deinem PHP-Script.

    Die Abfragen liessen sich noch leichter (ein 'INNER JOIN' weniger!) schreiben, wenn Du in der Tabelle 'gene' die Spalte 'gencode' gleich alsPrimärschlüssel verwenden würdest. Diesen müsstest Du dann natürlich auch wieder in der Tabelle 'combi' aufschnappen, also dort gäbe es dann die Spalten 'pid' und 'gcode' (statt 'gid').


    Beitrag zuletzt geändert: 17.3.2010 18:44:02 von cars-ten
  4. Autor dieses Themas

    decarabia

    decarabia hat kostenlosen Webspace.

    Hi,
    ich verstehe was du willst, aber leider reicht dafür meine Zeit im Moment dafür kaum aus, geschweigen denn mein Wissen (d.h. ich müsste mir das erst mühsam anlernen - das dauert halt - aber im Moment hab ichso viel zu tun und im Kopf, wegen einen bevor stehenden Umzug - und das mit gut 25 Ratten +4 Gebrils + Fische + evtl Katzen).

    Also, bis ich das hitner mir habe, muss das Script so bleiben, und eben auf Krücken laufen. Statt einer DB bezieht er seine Vergleiche ja aktuell aus dem Drop Down Menü. Das müsste ich später entsprechend verändern, wenn das in eine DB geht - aber das kommt später.

    Es muss doch irgendwo eine einfache Stelle geben, nach der Rechnung, an der ich nach BEbe, BEBE, BUbu, BUBU, DEDE, DEde bei NICHT vorhandenen cc, chch und chc suchen lassen kann und entfernen?

    Änderung 2: mit dede rechnet er nun richtig, fehler behoben
    Änderung 3: CHC wurde nicht rausgefiltert, fehler behoben

    Beitrag zuletzt geändert: 18.3.2010 0:24:17 von decarabia
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!