Ist das ein Bug!?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ist das ein Bug!?

    Hi ho!

    Habe gerade was merkwürdiges an meinem PHP5 Server festgestellt. Und zwar habe ich innerhalb einer Klasse ein Array, sagen wir mal mit folgenden Elementen:

    public static $array = array("0","1","2","3","4","5","6","7","8","9");

    Wenn ich nun folgende Abfrage mache:

    echo in_array("@", self::$array);

    bekomme ich eine 1 zurückgeliefert, obwohl sich @ NICHT im $array befindet. Ist das irgendwie ein Bug seitens PHP5 oder so!? Oder mache ich irgendetwas falsch!?

    Danke schonmal

  • #2
    PHP-Code:
    class test_001 {

        public static 
    $array = array("0","1","2","3","4","5","6","7","8","9");

        public function 
    check() {
            echo (int)
    in_array("@"self::$array);        
        }

    }

    $test = new test_001;

    $test->check(); 
    Ausgabe: 0

    Schlussfolgerung: Du machst was falsch
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      PHP-Code:
       <?php
          
          
      class Test {
              
              public static 
      $array = array( '0''1''2''3''4''5''6''7''8''9' );
              
              public static function 
      isInArray $value ) {
                  
                  if ( 
      in_array $valueself :: $array ) ) {
                      echo 
      'Der Wert ' $value ' befindet sich im Array.';
                  } else {
                      echo 
      'Der Wert ' $value ' befindet sich nicht im Array.';
                  }
                  
              }
              
          }
          
          
      $test = new Test ( );
          
          
      $test -> isInArray '1' );
          
      $test -> isInArray '@' );
          
      ?>
      Ausgabe:
      Code:
      Der Wert 1 befindet sich im Array.
      Der Wert @ befindet sich nicht im Array.
      EDIT:
      zu spät ... - evtl mal php update machen
      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

      Kommentar


      • #4
        PHPler, zeig mal dein minimales beispiel, in dem man das problem nachvollziehen kann.

        Kommentar


        • #5
          PHP-Code:
          <?
          class name {
              
              // $str mit Zeichen:
              public static $str = array();
              
              // Constructor
              function __construct() {

                  // Füllt das Array mit Zeichen:
                  self::$str = array_merge(range("a", "z"),range("A","Z"),range(0,9),array("_", "-"));
              }

              function check($val, $do) {
                  
                  // Switcht $do:
                  switch($do) {
                      
                      // Die Liste:
                      case 'str';
                      print_r(self::$str);
                      echo '<hr>';
                      echo in_array($val, self::$str);
                      echo '<hr>';
                      print_r(self::$str);
                      break;
                  }
              }
          }
          ?>
          Habe jetzt mal den unnötigen Krams rausgeschmissen. Nun gehe ich bei und sage:

          PHP-Code:
          <?
          $var = new name;

          echo $var->check("@", "str");
          ?>
          Und da gibt mir die Funktion (alias "in_array") eine 1 Zurück, obwohl sich da kein @ in self::$str befindet. Und wenn ich vor und nach dem "echo in_array($val, self::$str);" ein print_r(self::$str) mache, kann ich auch nirgends ein @ in der Ausgabe entdecken. Und trotzdem krieg ich eine 1 zurückgeliefert. Die Ausgabe von print_r(self::$str) sieht wie folgt aus:

          Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f [6] => g [7] => h [8] => i [9] => j [10] => k [11] => l [12] => m [13] => n [14] => o [15] => p [16] => q [17] => r [18] => s [19] => t [20] => u [21] => v [22] => w [23] => x [24] => y [25] => z [26] => A [27] => B [28] => C [29] => D [30] => E [31] => F [32] => G [33] => H [34] => I [35] => J [36] => K [37] => L [38] => M [39] => N [40] => O [41] => P [42] => Q [43] => R [44] => S [45] => T [46] => U [47] => V [48] => W [49] => X [50] => Y [51] => Z [52] => 0 [53] => 1 [54] => 2 [55] => 3 [56] => 4 [57] => 5 [58] => 6 [59] => 7 [60] => 8 [61] => 9 [62] => _ [63] => - )
          Daher ist mir die 1 auch ein Rätsel, da ja ansich nichts auf das $str Array zugreift und es auch nicht verändert.

          Kommentar


          • #6
            PHP-Code:
             if ( in_array $valself :: $array ) ) {
                            echo 
            '1';
                        } 
            gibt auch 1 aus?
            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

            Kommentar


            • #7
              @tontechniker: Jo!

              Kommentar


              • #8
                hole mal nach und nach die teilarrays im kosntruktor raus, dann kannst du evtl. eingrenzen, in welchem array @ angeblich liegen soll.

                Kommentar


                • #9
                  Hab ich, es liegt am range(0,9)! Aber warum das!? Gibt es da etwas was ich nicht weis!?

                  Kommentar


                  • #10
                    versuch mal den dritten parameter für in_array() zu setzen.

                    Kommentar


                    • #11
                      Habe ich auch schon, dann krieg ich gar nichts mehr zurückgeliefert. Das lustige ist im übrigen auch, dass nicht nur das @ in diesem Array liegt, sondern auch Sachen wie "a7868/)&G/)(%g76g587F" ect...

                      Kommentar


                      • #12
                        bleib erst mal bei den zahlen..

                        mach mal 3 arrays mit ziffern von 0 bis 9:

                        $a1 = range(...)
                        $a2 = array('0', '1', '2', ...)
                        $a3 = array(0, 1, 2, ...)

                        dann mach drei separate in_array() aufrufe (mit drittem parameter auf true!) auf jedes davon und zeige hier die ergebnisse.

                        Kommentar


                        • #13
                          PHP-Code:
                          echo in_array("@"range(0,9));
                          echo 
                          in_array("@", array(0,1,2,3,4,5,6,7,8,9));
                          echo 
                          in_array("@", array("0","1","2","3","4","5","6","7","8","9")); 
                          Die ersten beiden geben eine 1 aus, das dritte nicht. Interessant ist im übrigen, dass

                          count(array_intersect(array($val), self::$str));

                          eine 0 rausgibt, wenn das besagte Zeichen nicht im Array gefunden wird. Wüsste nur trotzdem gerne wieso das beim in_array nicht geht...

                          Kommentar


                          • #14
                            PHP-Code:
                            echo ( "string!!!" == 'type casting' 'wie erwartet' ); 
                            frage beantwortet?

                            Kommentar


                            • #15
                              Ach quatsch, ich hab übrlesen dass ich den dritten parameter noch mit setzen sollte, entsprechend geben

                              PHP-Code:
                              echo in_array("@"range(0,9), true);
                              echo 
                              in_array("@", array(0,1,2,3,4,5,6,7,8,9), true);
                              echo 
                              in_array("@", array("0","1","2","3","4","5","6","7","8","9"), true); 
                              rein gar nichts aus.

                              Im übrigen gibt

                              echo ( "string!!!" == 0 ? 'type casting' : 'wie erwartet' );

                              das selbe aus wie

                              echo ( 0 == 0 ? 'type casting' : 'wie erwartet' );

                              bzw.

                              echo ( "string!!!" == "string!!!" ? 'type casting' : 'wie erwartet' );

                              von daher k.a. was mir das jetzt sagen soll.

                              Einzig was bisher funktioniert ist array_intersect:

                              echo count(array_intersect(array("@"), self::$str));

                              Gibt beim @ eine 0 aus.

                              Kommentar

                              Lädt...
                              X