If-Else mit mehreren Bedingungen funktioniert nicht richtig

Caralynn

Mitglied
Hallo,

irgendwie kam ich gestern auf keinen grünen Zweig mit meiner if-else-Abfrage, die nicht das ausspuckt, was sie ausspucken soll :(
Sitze zur Zeit an einem kleinen Script für Meerschweincheninteressierte, welches bei Eingabe eines "Gencodes" die dazugehörige Rasse ausspuckt. Soweit so gut, bei den Langhaarigen klappte es auch zufriedenstellend, aber bei den Kurzhaarigen streikt die Abfrage, da ich mehrere Bedingungen habe:

PHP:
if(($rh == "rh") AND ($fz == "fz") AND ($rx == "Rx") AND ($ch == "Ch"))
 {
 echo("CH-Teddy");
 }
elseif(($rh == "rh") AND ($fz == "Fz") AND ($rx == "Rx") AND ($ch == "Ch"))
 {
 echo("Glatthaar");
 }
elseif(($rh == "rh") AND ($fz == "Fz") AND ($rx == "rx") AND ($ch == "Ch"))
 {
 echo("Rex");
 }
// .... und weitere Kombinationen
else
 {
 echo("Mischling");
 }

Als Ergebnis bekomme ich eben immer "Mischling", was insofern nicht stimmt, als das ich über den ausgegebenen Gencode ja weiß, dass es eine andere Rasse ist. Seit gestern rätsle ich, warum das so ist und Google und Forensuche haben nichts vergleichbares ausgespuckt (nur immer mit zwei Bedingungen bei Loginscripts z.B.).

Oder liegts daran, dass der Variablenname dem Variableninhalt so ähnlich sieht, dann krieg ich aber einen Krampf :eek:


LG,
Cara
 
Caralynn hat gesagt.:
Oder liegts daran, dass der Variablenname dem Variableninhalt so ähnlich sieht, dann krieg ich aber einen Krampf :eek:
Keine Angst, daran liegt’s bestimmt nicht.

Erzähl uns doch mal, was genau du überprüfen willst und unter welchen Bedingungen ein Meerschweinchen welcher Rasse dazugehört. Dann lässt sich dazu bestimmt auch eine schlaue if-Abfrage erstellen. Gibt’s die Seite denn schon online? Vielleicht liegt’s ja auch daran, dass die Variablen falsch übergeben werden. Hast du die schonmal vor der Abfrage alle ausgeben lassen?
 
Okay, ein kleiner Exkurs *g*

Die wichtigsten Variablen sind der l-locus (Lang- oder Kurzhaar), der Lu-locus (Lunkarya oder nicht), der rx_locus (Rex oder nicht), der fz_locus (US), der Rh_locus (Rosette oder nicht), M_locus (M) und der ch_locus (CH). Alle anderen sind jetzt erst mal egal.
Jeder Loci ist in der Form gespeichert bzw. angegebene: L.L für Kurzhaar, l.l für Langhaar. Der Punkt ist ein Trennzeichen, da ich später auch die Kreuzung möglich machen will und ich es mit Punkt einfach übersichtlicher finde.

Für die Rassebestimmung werden allerdings nur die Zeichen bis zum Punkt benötigt, da es da nur dominant und rezessiv gibt, also wird aus l.l ein l, aus Lu.lu ein Lu.

Bei der Rassebestimmung wird zunächst überprüft, ob das Meerschweinchen langhaarig oder kurzhaarig ist über eine if-else-Abfrage.

PHP:
if($felllaenge == "l") // Langhaarig
  {
  }
else // Kurzhaarig
  {
  }

In beiden Fällen wird dann als nächstes geschaut, ob das Tier ein Lunkarya ist oder nicht, da das Lunkarya-Gen dominant ist. Das geht wieder mit einer if-else-abfrage.

PHP:
if($lunkarya == "lu") // kein Lunkarya
  {
  }
else // Lunkarya
  {
  }

Bei den Langhaarigen funktioniert die Abfrage auch sehr schön, der fz_locus sowie der ch_locus spielen da keine Rolle (Züchterpraxis, heißt nicht, dass es keine langhaarigen Tiere mit diesen Allelen gibt!).
Aber bei den Kurzhaarigen spielen sie schon eine Rolle, sind anerkannte Rassen eben...
Also soll jetzt über eine lange if-elseif-else-Abfrage geschaut werden, welche Loci rezessiv und welche dominant vorhanden sind:

Wenn zum Beispiel:
rh Fz Rx Ch M = Glatthaar
rh fz Rx Ch M= US
rh Fz rx Ch M= Rex
rh Fz Rx ch M= CH
rh fz rx Ch M= US-Rex-Mischling
Rh Fz Rx Ch M = Ridgeback
Rh Fz Rx Ch m = Rosette

Also habe ich mir die Abfrage so vorgestellt:

PHP:
if(($rh == "rh") AND ($fz == "fz") AND ($rx == "Rx") AND ($ch == "Ch"))
      {
     echo("CH-Teddy");
      }
elseif(($rh == "rh") AND ($fz == "Fz") AND ($rx == "Rx") AND ($ch == "Ch"))
      {
      echo("Glatthaar");
      }
// .....

Eben jede mögliche Formel über mehrere Bedingungen definiert, das reicht ja für den Anfang, gibt nämlich noch mehr Loci...

Bevor die erste if-else-Abfrage kommt, habe ich mir zur Überprüfung der Ergebnisse die wichtigsten, zerteilten Allele ausgeben lassen, die Variablen werden also übergeben.

PHP:
echo("".$lunkarya."-".$rosi."-".$fz."-".$rx."-".$ch."-".$modi."-".$stirn."<br>");

@hizz:
Nein, das stimmt schon so... Groß geschriebene "Allele" sind dominant, klein geschriebene sind rezessiv. fzfz = US-Teddy, Fz Fz/fz = kein US-Teddy.
Allerdings ist die Rassebenennung falsch, ist kein CH-Teddy, sondern ein US-Teddy *ups*

Da die Variablen ja übergeben werden, schätze ich, dass das Problem entweder bei den Namen liegt oder bei der Syntax... oder ich hatte irgendwo den totalen Hänger.


LG,
Cara
 
Sehe ich das richtig, es gibt fünf (oder vier?) verschiedene Eigenschaften und für jede Kombination dieser gibt es eine andere Rasse? Das wären dann 32 verschiedene. Wenn du mich fragst, ich würde das eher mit einem Array lösen. Irgendwie so:
PHP:
$rassen = array('00000'=>'CH-Teddy', '00001'=>'Glatthaar');
Die fünfstellige Zahl steht für die fünf Eigenschaften (1=ja, 0=nein). So wird das meines Erachtens etwas übersichtlicher und du hast nicht so eine riesige if-Abfrage.
 
Ja, wären viele Zeilen, das stimmt schon - für mich sind if-else-abfragen aber immer viel einfacher zu begreifen, bei den Arrays steige ich bis heute nicht ganz durch :-/

Bei deiner Lösung habe ich dann also ein Array in der Form:
PHP:
$rassen = array('00000'=>'Glatthaar',
                        '00001'=>'Glatthaar',
                        '00100'=>'CH-Teddy');

Aber wie gebe ich es aus? - Ich muss ja erst mal von meinen rh Fz Rx CH M auf das 00000 für Glatthaar kommen, also noch ein Array? Oder kann man das gleich mit einem Array machen?

PHP:
$rassen = array('rh Fz Rx Ch M'=>'Glatthaar',
                        'rh Fz Rx Ch m'=>'Glatthaar',
                        'rh Fz Rx ch M'=>'CH-Teddy');

Und wie gebe ich dann für den entsprechenden Gencode das Richtige aus?
Einfach mit einem Echo?
PHP:
echo("".$rassen."");
Gefällt mir schon, die Möglichkeit, wenn es so geht... ^^
 
Caralynn hat gesagt.:
Ja, wären viele Zeilen, das stimmt schon - für mich sind if-else-abfragen aber immer viel einfacher zu begreifen, bei den Arrays steige ich bis heute nicht ganz durch :-/
Nur nicht den Mut verlieren! ;) Arrays sind gar nicht so schwer zu begreifen, und wenn man es einmal kapiert hat, können sie einem in sehr vielen Situationen das Leben enorm erleichtern.
Caralynn hat gesagt.:
Bei deiner Lösung habe ich dann also ein Array in der Form:
PHP:
$rassen = array('00000'=>'Glatthaar',
                        '00001'=>'Glatthaar',
                        '00100'=>'CH-Teddy');

Aber wie gebe ich es aus? - Ich muss ja erst mal von meinen rh Fz Rx CH M auf das 00000 für Glatthaar kommen, also noch ein Array? Oder kann man das gleich mit einem Array machen?

PHP:
$rassen = array('rh Fz Rx Ch M'=>'Glatthaar',
                        'rh Fz Rx Ch m'=>'Glatthaar',
                        'rh Fz Rx ch M'=>'CH-Teddy');
Da du uns leider immer noch nicht verraten hast, woher diese Daten kommen (also die Zeichenketten ’rh Fz Rx Ch M’) und vor allem in welcher Form sie genau kommen, kann ich dir dazu nichts genaues sagen. Du kannst es aber prinzipiell auf beide Arten lösen.
Caralynn hat gesagt.:
Und wie gebe ich dann für den entsprechenden Gencode das Richtige aus?
Einfach mit einem Echo?
PHP:
echo("".$rassen."");
Nicht ganz. Du musst ja noch angeben, welches Arrayelement du ausgeben willst – und dafür müssten wir wiederum wissen, wie die Daten reinkommen. Aber wenn die Zeichenkette ’rh Fz Rx Ch M’ z.B. in der Variable $eigenschaften gespeichert ist, dann greifst du auf die entsprechende Rasse so zu:
PHP:
$rassen[$eigenschaften]
 
Die Zeichenketten "rh.rh Fz.Fz Rx.Rx Ch.Ch" (usw...) werden im Moment durch jeweils ein kleines Zufallsscript (mit Array *g*) erstellt, Spielerei eben, damit alles durchgetestet werden kann.


Es wird also zunächst Rh.Rh, Rh.rh oder rh.rh generiert, dann Fz.Fz, Fz.fz oder fz.fz und so weiter... am Ende gibt es dann, wenn man sie zusammen in einer Variablen speichert, eine komplette Genformel.

Die nenne ich dann $eigenschaften und kann mir dann mit
PHP:
echo("".$rassen[$eigenschaften]."");

die Rasse ausgeben lassen, oder?
 
Genau. Allerdings sind die Anführungszeichen überflüssig, so geht’s auch:
PHP:
echo($rassen[$eigenschaften]);
Übrigens brauchst du bei [phpf]echo[/phpf] nicht zwingend den Text in Klammern angeben.
 
Dankeschön, funktioniert wunderbar, hoffe nur, dass ich alles erwischt habe :D

Allerdings war es immer noch viel Schreibarbeit (obwohl ich ein paar if-else-Anfragen noch eingebaut habe, damit es für mich übersichtlicher wird)...
 
Zurück