Barbara: PHP Vergleichsoperator = mit 3 Möglichkeiten

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

    1. 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!

      1. 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.

        1. if ( in_array( $name, [ 'Hans', 'Max', 'Franz' ], 1 ) ) {

          Jetzt stehe ich grad auf der Leitung ... wofür steht denn das " , 1 " da??

          1. 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().

            1. 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?

              1. Ja. Du hast übersehen, dass auch die 1 "true genug" ist. Du wolltest es doch kürzer…

                1. 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?

                  1. 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

                    --
                    Rosen sind rot.
                    1. 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.

                      1. 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

                        --
                        Rosen sind rot.
                      2. 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.

                  2. 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.

                2. 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.

            2. wofür steht denn das " , 1 " da?

              Du wolltest einen strikten Vergleich.

              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

              1. 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!"

                1. 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 😉

              2. wofür steht denn das " , 1 " da?

                Du wolltest einen strikten Vergleich.

                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.

  1. Idee:

    if( preg_match("/\bHans|Max|Franz\b/", $name) ) { 
       echo "Name $name passt"; 
    }
    

    Ist auch einfach erweiterbar. MfG