Marco: php.net, in_array, Fehler?!

Moinsen,

ich bin nach der Suche von "in_array" bei php.net fündig geworden.

Entweder verstehe ich da ein Beispiel nicht!
Oder da liegt ein Fehler vor.

<?php  
  
// Example array  
  
$array = array(  
    'egg' => true,  
    'cheese' => false,  
    'hair' => 765,  
    'goblins' => null,  
    'ogres' => 'no ogres allowed in this array'  
);  
  
// Loose checking -- return values are in comments  
  
// First three make sense, last four do not  
  
in_array(null, $array); // true  
in_array(false, $array); // true  
in_array(765, $array); // true  
in_array(763, $array); // true  
in_array('egg', $array); // true  
in_array('hhh', $array); // true       FEHLER???  
in_array(array(), $array); // true  
...  
?>

Müsste:
in_array('hhh', $array);
Nicht FALSE sein?

"hhh" gibt es doch garnicht im Array?!

Hier der Link zur Seite

Vielen Dank

MfG
Marco

  1. Hello,

    Moinsen,

    ich bin nach der Suche von "in_array" bei php.net fündig geworden.

    Entweder verstehe ich da ein Beispiel nicht!
    Oder da liegt ein Fehler vor.

    <?php

    // Example array

    $array = array(
        'egg' => true,
        'cheese' => false,
        'hair' => 765,
        'goblins' => null,
        'ogres' => 'no ogres allowed in this array'
    );

    // Loose checking -- return values are in comments

    // First three make sense, last four do not

    in_array(null, $array); // true
    in_array(false, $array); // true
    in_array(765, $array); // true         ## == $array['egg'], == $array['hair']
    in_array(763, $array); // true         ## == $array['egg'],
    in_array('egg', $array); // true
    in_array('hhh', $array); // true       FEHLER??? ## == $array['egg'],
    in_array(array(), $array); // true

    // Strict checking

    in_array(null, $array, true); // true
    in_array(false, $array, true); // true
    in_array(765, $array, true); // true
    in_array(763, $array, true); // false
    in_array('egg', $array, true); // false
    in_array('hhh', $array, true); // false        ## <-- Und hier?
    in_array(array(), $array, true); // false

    ?>

    
    >   
    > Müsste:  
    > `in_array('hhh', $array);`{:.language-php}  
    > Nicht FALSE sein?  
    >   
    > "hhh" gibt es doch garnicht im Array?!  
    >   
    > [Hier der Link zur Seite](http://de3.php.net/manual/de/function.in-array.php)  
    >   
    > Vielen Dank  
    >   
    > MfG  
    > Marco  
    
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    <http://bikers-lodge.com>
    
  2. Hi,

    <?php

    // Example array

    $array = array(
        'egg' => true,
        'cheese' => false,
        'hair' => 765,
        'goblins' => null,
        'ogres' => 'no ogres allowed in this array'
    );

    // Loose checking -- return values are in comments
    // First three make sense, last four do not

    in_array(null, $array); // true
    in_array(false, $array); // true
    in_array(765, $array); // true
    in_array(763, $array); // true
    in_array('egg', $array); // true
    in_array('hhh', $array); // true       FEHLER???
    in_array(array(), $array); // true
    ...
    ?>

    
    >   
    > Müsste:  
    > `in_array('hhh', $array);`{:.language-php}  
    > Nicht FALSE sein?  
      
    nach meinem Verständnis eigentlich schon, auch der Test mit 763 sollte schon false ergeben. Das ist sicher wieder so'n Fallstrick mit der automatischen Typumwandlung - nur dass ich hier nicht einmal den Ansatz einer Erklärung finde.  
      
    
    > [Hier der Link zur Seite](http://de3.php.net/manual/de/function.in-array.php)  
      
    Huch, was stellen denn die Jungs bei php.net gerade an? Am 1. April hätte ich das ja ganz lustig gefunden, aber heute?  
      
    ![](http://screenshots.kennst.net/screenshot-php.net-in-array.png)  
      
    Dass die Liste der Funktionen am linken Rand seltsame Kästchen in den Funktionsnamen hat, habe ich ja schon akzeptiert, das ist seit der Neugestaltung von php.net so. Aber jetzt irgendeinen Symbolfont für Code-Beispiele? Da hat doch wohl jemand was verbockt (Darstellung in Opera 12.16 unter Linux). Firefox zeigt's auf demselben System normal lesbar an. Seltsam ...  
      
    So long,  
     Martin  
    
    -- 
    Ein guter Lehrer muss seinen Schülern beibringen können,  
    eine Frage so zu stellen, dass auch der Lehrer lernen muss,  
    um die Frage beantworten zu können.  
      (Hesiod, griech. Philosoph, um 700 v.Chr.)  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hello,

      [... ] Das ist sicher wieder so'n Fallstrick mit der automatischen Typumwandlung - nur dass ich hier nicht einmal den Ansatz einer Erklärung finde.

      Hab ich doch schon gezeigt, was da wieder passiert.
      Typumwandlung ist schon richtig. Da werden alle Eingaben == true, aber nicht: === true :-P

      Darum gibt es die Prüfungsvariante "strict".

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bikers-lodge.com
      1. Moinsen,

        @Martin

        nach meinem Verständnis eigentlich schon, auch der Test mit 763 sollte schon false ergeben. Das ist sicher wieder so'n Fallstrick mit der automatischen Typumwandlung - nur dass ich hier nicht einmal den Ansatz einer Erklärung finde.

        Dann bin ich ja doch nicht auf den Kopf gefallen :P :D

        @Tom

        Darum gibt es die Prüfungsvariante "strict".

        Aber "strict" wird erst im zweiten Ansatz verwendet :p

        Ist ja auch nicht sooooooo wichtig... Solange man das Prinzip versteht ;)

        MfG
        Marco

    2. Hello,

      Huch, was stellen denn die Jungs bei php.net gerade an? Am 1. April hätte ich das ja ganz lustig gefunden, aber heute?

      Die basteln wohl gerade an ihrem neuen CSS.

      Jetzt sieht es im Iceweasel auf Debian auch ulkig aus. absolut kein Padding und keine Margins mehr. Allerdings kann ich alle Zeichen lesen.

      Im alten Firefox auf WinDOS XP sieht es noch so aus, wie die ganzen letzten Wochen.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bikers-lodge.com
      1. Hallo,

        Huch, was stellen denn die Jungs bei php.net gerade an? Am 1. April hätte ich das ja ganz lustig gefunden, aber heute?
        Die basteln wohl gerade an ihrem neuen CSS.

        irgendwas in der Art muss es sein - jetzt sehe ich nämlich auch wieder eine normale lesbare Schrift, so wie ich es all die Zeit gewöhnt war.

        Die Kästchen in den Funktionsnamen sind übrigens U+200B, wie ich inzwischen per Quelltext herausgefunden habe. Das ist ein "Zero Width Space". Anscheinend versteht Opera das nicht und zeigt deshalb das Ersatzzeichen für "hab ich nicht" an.

        Im alten Firefox auf WinDOS XP sieht es noch so aus, wie die ganzen letzten Wochen.

        Weiß der Geier, was die da basteln.

        Ciao,
         Martin

        --
        Ich denke, also bin ich hier falsch.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    3. Moin

      'egg' => true,
          'cheese' => false,

      in_array(null, $array); // true
      in_array(false, $array); // true
      in_array(765, $array); // true
      in_array(763, $array); // true
      in_array('egg', $array); // true
      in_array('hhh', $array); // true       FEHLER???
      in_array(array(), $array); // true
      ...
      ?>[/code]

      Müsste:
      in_array('hhh', $array);
      Nicht FALSE sein?

      nach meinem Verständnis eigentlich schon, auch der Test mit 763 sollte schon false ergeben. Das ist sicher wieder so'n Fallstrick mit der automatischen Typumwandlung - nur dass ich hier nicht einmal den Ansatz einer Erklärung

      Genau so ist es.. durch die beiden einträge egg => true und cheese => false wird jede Prüfung mittels in-array gültig, da durch die implizite Datentypwandlung jeder Wert außer 0, 0.0, false, "", array (), null als true interpretiert werden. Und true ist ja im array vorhanden. Die genannten werte ergeben false. Auch false ist im array vorhanden. Zur korrekten Prüfung gibts ja den strict-parameter zur Äquivalenzprüfung

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      ### Henry L. Mencken ###
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ### Viktor Frankl ###
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  3. Tach!

    ich bin nach der Suche von "in_array" bei php.net fündig geworden.
    Entweder verstehe ich da ein Beispiel nicht!
    Oder da liegt ein Fehler vor.

    <?php

    // Example array

    $array = array(
        'egg' => true,
        'cheese' => false,
        'hair' => 765,
        'goblins' => null,
        'ogres' => 'no ogres allowed in this array'
    );

      
    Meines Erachtens liegt da sehr wohl ein Fehler vor. Der betrifft aber nicht die Ergebnisse des Beispiels sondern die Art und Weise, wie da Daten zusammengewürfelt werden. Wer die so kunterbunt in einen großen Topf wirft, sollte sich nicht wundern, wenn da drin alles mögliche gefunden werden kann.  
      
    Bist du denn mit deinem Datenmodell auf ebendiese Probleme gestoßen? Dann sollten wir vielleicht das Datenmodel zu verbessern suchen, anstatt nach Lösungen zu suchen, wie man Tierhaltungsnebenprodukten einen Blümchengeruch geben kann. - Entschuldige bitte, das solltest du jetzt nicht auf dich beziehen, ich wollte den Vergleich lediglich etwas überspitzt bildlich gestalten und keinesfalls eine Wertung für etwas vornehmen, was ich noch nicht einmal gesehen haben.  
      
      
    dedlfix.
    
    1. Moin

      Meines Erachtens liegt da sehr wohl ein Fehler vor. Der betrifft aber nicht die Ergebnisse des Beispiels sondern die Art und Weise, wie da Daten zusammengewürfelt werden. Wer die so kunterbunt in einen großen Topf wirft, sollte sich nicht wundern, wenn da drin alles mögliche gefunden werden kann.

      Ich könnte mir als einziges vorstellen, dass dieses Array wie ein Objekt genutzt wird und somit verschiedene Attribute mit verschiedenen Datentypen enthält. Ich weiß, eh jetzt wieder losgekräht wird, dann bitte ein Objekt nutzen. Dann fallen aber eben die Array-Funktionen flach.

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      ### Henry L. Mencken ###
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ### Viktor Frankl ###
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      1. Tach!

        Meines Erachtens liegt da sehr wohl ein Fehler vor. Der betrifft aber nicht die Ergebnisse des Beispiels sondern die Art und Weise, wie da Daten zusammengewürfelt werden. Wer die so kunterbunt in einen großen Topf wirft, sollte sich nicht wundern, wenn da drin alles mögliche gefunden werden kann.

        Ich könnte mir als einziges vorstellen, dass dieses Array wie ein Objekt genutzt wird und somit verschiedene Attribute mit verschiedenen Datentypen enthält. Ich weiß, eh jetzt wieder losgekräht wird, dann bitte ein Objekt nutzen. Dann fallen aber eben die Array-Funktionen flach.

        Ich kann mir grad keinen Anwendungsfall vorstellen, bei dem ich von einem Objekt (egal ob als richtiges oder als ein Array) in sämtlichen unterschiedlichen Eigenschaften (von Boolean bis String) einen Wert suchen wollen würde. Suche ich eine Zeichenfolge, die durchaus auch in mehreren String-Eigenschaften vorkommen kann, dann durchsuche ich diese und lass die Boolean- und Zahlen-Eigenschaften außen vor.

        dedlfix.