Längere Ternary Operation wird nicht durchgeführt

Tleifight

Grünschnabel
Hallo,

ich habe ein Problem bezüglich der Ternary Operation.
Ich programmiere mit PHP und mysql.

Zum Problem:
Ich habe eine Funktion, die ein String und einen Wert übernimmt. Der String wird mit dem Ternary Operator geprüft und ein passender Wert wird zurückgegeben. Das Problem ist nun, dass ich nicht den richtigen Wert zurück bekomme.

Quellcode:
function Vergleich($Text,$Wert)
{
$Skalierung = ($Text==="abc") ? 14 :
($Text==="def") ? 15 :
usw...
12;

return $Skalierung
}

Lasse ich die Funktion nun durchlaufen, bekomme ich nur selten den richtigen Wert zum Text angezeigt...
Ich habe das ganze vorher mit der Switch-Case Methode durchlaufen lassen und da lief alles.
 
Hi

Setz den Else-Teil doch mal in Klammern.
PHP:
$Skalierung = ($Text==="abc") ? 14 : (($Text==="def") ? 15 : (...));
Nur...warum eigentlich kein switch, oder if/else-if/else?
 
Die Switch Anweisung ist deutlich langsamer als die Ternäre Anweisung. Ich optimiere meinen Quellcode und da ist jede Sekunde wertvoll.
Wenn ich alles in Klammern setze, habe ich bei 20Anweisung sehr viele Klammern...
Ich werds aber mal probieren.

edit:
Hat leider nicht funktioniert. Es wird auch nicht die letzte Anweisung ausgeführt(12), sondern eine zwischen drin...
PHP:
function Vergleich($Text,$Wert)
{
$Skalierung = ($Text==="abc") ? 14 :
(($Text==="def") ? 15 :
usw...
12);

if  ($Text==="abc")
{ echo $Text; }

return $Skalierung
}

Im echo wird Beispielsweise statt 14 einfach 15 angezeigt.
 
Zeig mal die komplete Anweisung, ohne dazwischen mit dem "usw..." was rauszuschneiden.

Zum Optimieren: Misst du das bei der Erstausführung (nach einer Änderung)
oder schon nach der Programmcacheverarbeitung?
Oder verwendest du vllt. überhaupt keinen Cache (APC...)?

Und bitte keine Doppelposts.
 
PHP:
function Vergleich($Text,$Wert)
{
$Skalierung = ($Text==="abc") ? 20 :
(($Text==="def") ? 19 :
(($Text==="ghi") ? 18 :
(($Text==="jkl") ? 17 :
(($Text==="mno") ? 16 :
12))));

if  ($Text==="abc")
{ echo $Text; }

return $Skalierung
}
So nachdem ich alle Operationen Eingeklammert habe scheint es jetzt zu laufen.

Ich messe die Laufzeit über die microtime des ganzen Scriptes. Mein Programm liest hunderte Dateien ein und überträgt diese auf die Datenbank. Am Anfang starte ich den Microtimer lese, verarbeite und füge den Inhalt am Schluss in die Datenbank und danach stoppe ich den Timer und lass mir die Zeit ausgeben.
Durch die Ternäre Operation habe ich ca. 3 Sekunden eingespart :) Von 6 bis 8 Sekunden auf 4 bis 5 Sekunden...

Zu früh gefreut, ich muss anscheinend jede Abfrage extra Klammern...
Das sind dann hunderte von Klammern, gibt es da keine andere Möglichkeit ohne auf den Ternären Operator zu verzichten?
 
Zuletzt bearbeitet von einem Moderator:
Zur Laufzeitmessung nochmal:
Ich meinte eigentlich, ob du einen Bytecodecache wie APC installiert hast
und wenn ja, ob du die Zeitmessung beim Erstdurchlauf durchführst
(oder das ganze zuerst einmal so ausführst und dann beim zweiten, dritten... Mal
erst die Werte nimmst).

Falls kein Cache: Verwend einen. Hilft für die Geschwindigkeit wirklich.
Falls schon: Ein neues bzw. gerade geändertes Script
muss zuerst einmal komplett geparst werden, aber nur beim ersten Durchlauf.
Die nächsten Durchläufe sollten schneller sein (bis zur nächsten Codeänderung).

Und bitte keine Doppelposts :rolleyes:
 
Achso das meintest du, bisher verwende ich keinen Bytecodecache. Noch nicht :D Den werde ich mir mal zu Gemüte führen. Ich glaube aber kaum das ich da noch viel raus holen kann. Das Script wird nur einmal gestartet und der Rest läuft dann im Hintergrund, bis es fertig ist.
 
Zurück