PHP Vergleichsoperator = mit 3 Möglichkeiten
Barbara
- php
1 Regina Schaukrug-1 pl
Hallo!
Ich bilde mir ein, dass ich mal eine Kurzschreibweise für einen Vergleich mit mehreren Optionen gesehen habe, ich kann mich aber auch täuschen und das verwechseln. Ich meine, statt einem
if ( $name === 'Hans' || $Sname === 'Max' || $Sname === 'Franz' )
sowas in der Art wie
if ( $name === ('Hans', 'Max', 'Franz') )
Gibt es etwas in diese Richtung oder hab ich das falsch in Erinnerung?
Danke & liebe Grüße
Barbara
Wenn ich hier mit in_array()
anfange zu arbeiten, wird der Code am Ende noch länger als ursprünglich. Ich will ihn ja verkürzen!
Tja. Wenn Dein Array so klein bleibt und immer die selbe Zahl von Elementen hat dann stellt sich die Frage, ob sich das lohnt. Und jetzt hör auf zu heulen, denn
if ( in_array( $name, [ 'Hans', 'Max', 'Franz' ], 1 ) ) {
ist auch nur ein Einzeiler. Viel Spaß beim Programm-neu-schreiben, wenn erst die Ines und dann der Gregor dazukommt.
if ( in_array( $name, [ 'Hans', 'Max', 'Franz' ], 1 ) ) {
Jetzt stehe ich grad auf der Leitung ... wofür steht denn das " , 1 " da??
wofür steht denn das " , 1 " da?
Du wolltest einen strikten Vergleich. Du hast einen strikten Vergleich bekommen. Steht in der von mir verlinkten Dokumentation für in_array().
Ind er Dokumentation von in_array() steht als 3. optionaler Wert ein TRUE, also ein bool Wert. 1 ist aber doch ein Integer. Oder meinst Du etwas, was ich übersehen hebe in der Doku?
Ja. Du hast übersehen, dass auch die 1 "true genug" ist. Du wolltest es doch kürzer…
Ich habe jetzt versuchsweise
if (in_array($name, ['Hans', 'Max', 'Franz'], 'grunz'))
geschrieben und das funktioniert auch. Heißt das, dass ALLES außer 'FALSE' als 'TRUE' gewertet wird?
Hallo Barbara,
geschrieben und das funktioniert auch. Heißt das, dass ALLES außer 'FALSE' als 'TRUE' gewertet wird?
Alles, was nicht zu false evaluiert. Die Dokumentation sollte alle Möglichkeiten nennen.
Bis demnächst
Matthias
Die Dokumentation auf besagter Seite nennet das, was ich gesagt habe, nämlich ein optionales TRUE. Mehr steht da nicht.
Übrigens bin ich grad draufgekommen, dass man ein "Fatal error: Uncaught TypeError: in_array() expects parameter 3 to be boolean, integer given" erhält, wenn man im Code ganz oben declare(strict_types = 1);
stehen hat und 1 statt TRUE schreibt.
Hallo Barbara,
Die Dokumentation auf besagter Seite nennet das, was ich gesagt habe, nämlich ein optionales TRUE. Mehr steht da nicht.
Naja, die Dokumentation ist wesentlich mehr als nur die eine Seite. http://php.net/manual/de/language.types.boolean.php
Bis demnächst
Matthias
Die Dokumentation auf besagter Seite nennet das, was ich gesagt habe, nämlich ein optionales TRUE. Mehr steht da nicht.
Dein Browser ist kaputt. Meiner zeigt an:
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ]
[…]
Parameter
[…]
strict
Wenn der dritte Parameter auf TRUE gesetzt wird, vergleicht in_array() nicht nur den Wert sondern auch den Typ des gesuchten Wertes needle mit den Elementen des Arrays.
Aber da noch was in Deiner Antwort:
wenn man im Code ganz oben declare(strict_types = 1); stehen hat
Erst willst Du weniger schreiben und jetzt hat Dein Topf ein Loch weshalb Du so viel mehr geschrieben hast. Schön, dass Du trotz Link den Parameter nicht nachgeschlagen und statt dessen im Forum nachgefragt und uns declare(strict_types = 1); ohne Link präsentiert hast.
Danke, dass wir Ihro Oberklugheit antworten durften.
Heißt das, dass ALLES außer 'FALSE' als 'TRUE' gewertet wird?
Nein. Das heisst, dass sogar 'FALSE' als TRUE
gewertet wird. Das ist nämlich, jedenfalls mit Stringbegrenzern, ein nicht-leerer String.
Tach!
Ja. Du hast übersehen, dass auch die 1 "true genug" ist. Du wolltest es doch kürzer…
Es ist nicht sinnvoll, auf Teufel komm raus so zu verkürzen, dass am Ende die Lesbarkeit darunter leidet. Wenn ein boolescher Wert gefordert ist, dann sollte man den auch ruhig als true/false schreiben. Das bisschen macht das Kraut nicht fett, und verwirrt mehr als es nützt.
dedlfix.
wofür steht denn das " , 1 " da?
Mit preg_match() ergibt sich automatisch der strict-Mode weil string mit string verglichen wird, also type-gleich. Und aus einen Array das pattern zu erzeugen (Frage der Skalierbarkeit) ist auch nicht weiter aufwändig. MfG
Mit preg_match() ergibt sich automatisch der strict-Mode weil string mit string verglichen wird, also type-gleich.
So genau wissen wir das nicht. Ich bin davon ausgegangen, dass die gezeigten Daten nur ein Beispiel sind. Statt irgendwelcher Namen könnten da auch Integers, Decimals, beide als Strings mit der Gültigkeit [0-9.] oder sogar boolenansche Werte in Frage kommen. Ich weiss also nicht, warum der Fragesteller eine Typüberprüfung haben wollte - er hat es aber so notiert.
Das von Dir gezeigte preg_match()
ist zwar auch eine Idee, erscheint mir aber "teuer". Gerade wenn man noch hingeht und das Pattern aus einem Array erzeugt sogar viel zu teuer. Da wäre sogar ein array_flip()
und eine Prüfung mit isset()
wohl deutlich billiger.
<?php
$liste = array_flip( ['Jan', 'Paul', 'Monika'] );
$name = 'Monika';
if ( isset( $liste[ $name ] ) ) {
echo "Ja!\n";
} else {
echo "Nein!\n";
}
Das geht übrigens schon mit $liste = array_flip( ['Jan', 1.4, 'Monika'] );
schief: "PHP Warning: array_flip(): Can only flip STRING and INTEGER values!"
Mit preg_match() ergibt sich automatisch der strict-Mode weil string mit string verglichen wird, also type-gleich.
So genau wissen wir das nicht.
Stimmt. Und die Praxis sieht sowieso ganz anders aus 😉
wofür steht denn das " , 1 " da?
Mit preg_match() ergibt sich automatisch der strict-Mode weil string mit string verglichen wird, also type-gleich.
Leider nein. PHP wandelt den zweiten Parameter automatisch in einen String um, wenn man an dessen Stelle eine Zahl übergibt: preg_match("/\bHans|Max|Franz|42\b/", 42);
gibt 1
zurück. Das heißt, da findet TypeCoercing statt, genau das will man ja mit dem strikten Vergleich vermeiden, weil "42" !== 42
ist.
Idee:
if( preg_match("/\bHans|Max|Franz\b/", $name) ) {
echo "Name $name passt";
}
Ist auch einfach erweiterbar. MfG