Bene: Verständnisproblem mit Funktion in_array

Hallo,

warum liefert mir der folgende Code die nachfolgende Ausgabe ....

Code:

  
 if( in_array("abcdefg", array(0,1,2,3)) ) {  
  echo "abcdefg gefunden";  
 }  
 else  
 {  
  echo "abcdefg nicht gefunden";  
 }  

Ausgabe:
abcdefg gefunden

Danke und Grüße
Bene

  1. Hello,

    ohne das Phänomen selbst gehabt oder überprüft zu haben, tippe ich auf den dritten Parameter. Es könnte am Typunterschied zwischen haystack und needle liegen.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
    1. Hallo,

      vielen Dank für die Antwort.
      Setzte ich den dritten Parameter auf true, so wird der String nicht mehr in der Liste der int-Werte gefunden. Trotzdem ist es mir rätselhaft, warum die Funktion ohne den dritten Parameter true zurückliefert.

      Viele Grüße
      Bene

      Hello,

      ohne das Phänomen selbst gehabt oder überprüft zu haben, tippe ich auf den dritten Parameter. Es könnte am Typunterschied zwischen haystack und needle liegen.

      MfG
      Rouven

      1. vielen Dank für die Antwort.
        Setzte ich den dritten Parameter auf true, so wird der String nicht mehr in der Liste der int-Werte gefunden. Trotzdem ist es mir rätselhaft, warum die Funktion ohne den dritten Parameter true zurückliefert.

        Ganz einfach - Der Typ der Elemente des Arrays ist Integer, der String wird zum Vergleichen ebenfalls nach Integer umgewandelt. Den Regeln der Konvertierung von String zu Integer gemäß kommt dabei 0 heraus, dieser Wert kommt im Array vor.
        Ein weiteres Beispiel dafür, wie verwirrend PHP sein kann.

        --
        Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
        Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
        1. Hello,

          Ein weiteres Beispiel dafür, wie verwirrend PHP sein kann.

          PHP wird nur verwirrend, wenn man unvollständigen oder schlampigen Code schreibt und/oder die Notices ausschaltet.

          Die "Spezialität" mit '', 0, false usw. muss man allerdings lernen, so wie man in jeder Programmiersprache irgendwelche "Spezialitäten" lernen muss.

          Liebe Grüße aus Syburg bei Dortmund

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hallo,

            danke für eure Antworten.
            Eigentlich war ich mir über diese Eigenheiten von PHP im klaren, in diesem Fall hätte ich aber nicht gedacht, dass überhaupt probiert wird den String in einen Integer umzuwandeln.

            Viele Grüße
            Bene

            Hello,

            Ein weiteres Beispiel dafür, wie verwirrend PHP sein kann.

            PHP wird nur verwirrend, wenn man unvollständigen oder schlampigen Code schreibt und/oder die Notices ausschaltet.

            Die "Spezialität" mit '', 0, false usw. muss man allerdings lernen, so wie man in jeder Programmiersprache irgendwelche "Spezialitäten" lernen muss.

            Liebe Grüße aus Syburg bei Dortmund

            Tom vom Berg

          2. PHP wird nur verwirrend, wenn man unvollständigen oder schlampigen Code schreibt und/oder die Notices ausschaltet.

            Die "Spezialität" mit '', 0, false usw. muss man allerdings lernen, so wie man in jeder Programmiersprache irgendwelche "Spezialitäten" lernen muss.

            Dinge, die überraschend sind, sind in einer Programmiersprache immer schlecht. Dass 'abcdefg' in der Menge [0, 1, 2] enthalten sein soll, ist überraschend. Dass in PHP gelten kann, dass a gleich b, b gleich c, aber a ungleich c, ist auch überraschend.
            Solche Spezialitäten, die letztlich grober Unfug sind, machen die Sprache so schlecht, wie sie ist.

            --
            Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
            Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
            1. Hello,

              Solche Spezialitäten, die letztlich grober Unfug sind, machen die Sprache so schlecht, wie sie ist.

              Ich kann nicht feststellen, dass die Sprache schlecht ist.

              Und ich würde mich mit dieser Äußerung auch zurückhalten, bis ich eine bessere erfunden hätte oder aber wenigstens genau die "schlechten Stellen" benennen könnte nebst meiner Vorschläge für bessere Alternativen.

              Die automatische Typumwandlung in PHP finde ich auch nicht immer gut, schlimmer finde ich aber die iplizite Deklaration von Variablen. Gäbe es die nicht, würden viele Sicherheitslücken von selber verschwinden. Es wären aber auch solche Dinge wie

              while( $_rec = mysql_fetch_assoc($res) )
                {
                    $_table[] = $_rec;
                }

              nicht möglich, ohne wieder eine Ausnahme zuzulassen.

              Man muss also überlegen, an welchen Stellen man ein striktere Handhabung haben will und an welchen sie lästig wäre.

              Vielleicht führen die PHP-Entwickler ja einen Schalter "strikt_vars" ein, mit dem die grundsätzliche Deklaration von Variablen (also nicht deren Dimension, sondern "nur" deren Existenz und Grundtyp) zur Pflicht wird. Meisnt Du, dass wir eine genügend fundierte Anforderung dafür formulieren könnten/sollten?

              Liebe Grüße aus Syburg bei Dortmund

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Ich kann nicht feststellen, dass die Sprache schlecht ist.
                Und ich würde mich mit dieser Äußerung auch zurückhalten, bis ich eine bessere erfunden hätte oder aber wenigstens genau die "schlechten Stellen" benennen könnte nebst meiner Vorschläge für bessere Alternativen.

                "'abcdefg' ist in [0, 1, 2] enthalten" ist bereits eine solche schlechte Stelle, verursacht durch die implizite Umwandlung. Bene wurde offenkundig völlig überrascht. Das Beispiel "a gleich b, b gleich c, aber a ungleich c", das in PHP möglich ist, habe ich auch schon genannt.
                Und ich habe noch eine ganze Reihe anderer Probleme mit PHP:

                • Zwar besitzt PHP inzwischen eine anständige Unterstützung für Objektorientierung, aber große Teile der API sind immer noch nicht objektorientiert. Arrays und Strings sind beispielsweise keine Objekte.
                • Undurchsichtige Funktionsbenennungen: str_split vs. strcmp (mit Unterstrich und ohne), strlen vs. substr ('str' vorn und hinten)
                • Völlig überdimensioniert: Wenn ich mir die ganzen Array- und String-Funktionen anschaue, wird mir übel. Das hätte man mit viel weniger lösen können.
                  Insgesamt merkt man der Sprache ihre Geschichte einfach an.

                Die automatische Typumwandlung in PHP finde ich auch nicht immer gut, schlimmer finde ich aber die iplizite Deklaration von Variablen. Gäbe es die nicht, würden viele Sicherheitslücken von selber verschwinden. Es wären aber auch solche Dinge wie
                  while( $_rec = mysql_fetch_assoc($res) )
                  {
                      $_table[] = $_rec;
                  }
                nicht möglich, ohne wieder eine Ausnahme zuzulassen.

                array_push($_table, $_rec); eventuell?

                Man muss also überlegen, an welchen Stellen man ein striktere Handhabung haben will und an welchen sie lästig wäre.
                Vielleicht führen die PHP-Entwickler ja einen Schalter "strikt_vars" ein, mit dem die grundsätzliche Deklaration von Variablen (also nicht deren Dimension, sondern "nur" deren Existenz und Grundtyp) zur Pflicht wird. Meisnt Du, dass wir eine genügend fundierte Anforderung dafür formulieren könnten/sollten?

                register_globals ist der Schalter, der für die Sicherheitslücke verantwortlich ist, standardmäßig ist das seit Version 4.2.0 auf 'aus' (kann aber natürlich aktiviert werden in der entsprechenden Konfigurationsdatei) und ist seit 6.0.0 verschwunden. Undeklarierte Variablen können allerdings weiter genutzt werden, einen Schalter dagegen habe ich nicht gefunden.

                --
                Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
                Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
  2. Hello,

    warum liefert mir der folgende Code die nachfolgende Ausgabe ....

    Ausgabe:
    abcdefg gefunden

    Lass mal die 0 weg im Haystack und erzähöe, wes dann passiert.

    Wenn man   echo intval("abcdefg")   schreibt, was kommt dann?

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de