Benni: Zugriff auf mehrdim. assoz. Feld

Hallo,
warum ist im folgenden Beispiel $e leer?

  
<?php  
$hd[]= array ('a2'   => array ('aaaaa',  'a123',  'dfgdf',  'dere', ));  
$hd[]= array ('a3'   => array ('caaa',  'a4',  'juiof',  'trre', ));  
$hd[]= array ('b7'   => array ('artaaaa',  'vt',  'ewwwf',  'jkllk', ));  
......  
function getit ($p1)  
  {  
   $e [0] = $hd[$shp][0];  
   $e [1] = $hd[$shp][1];  
   $e [2] = $hd[$shp][2];  
   return $e;  
  }  
  
$erg = getit ('a3');  
  
?>  

  1. Hallo Benni,

    warum ist im folgenden Beispiel $e leer? [...]

    Weil $hd (und auch $shp) innerhalb der Funktion nicht existiert - du solltest error_reporting voll aufdrehen um auch Notices zu sehen.

    Gruß,
    Tobias

  2. Hi,

    function getit ($p1)
      {
       $e [0] = $hd[$shp][0];
       $e [1] = $hd[$shp][1];
       $e [2] = $hd[$shp][2];
       return $e;
      }

    Ergänzend zu tk: wozu hat die Funktion einen Parameter, wenn dieser gar nicht benutzt wird?
    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Hi,

      function getit ($p1)
        {
         $e [0] = $hd[$shp][0];
         $e [1] = $hd[$shp][1];
         $e [2] = $hd[$shp][2];
         return $e;
        }

      Ergänzend zu tk: wozu hat die Funktion einen Parameter, wenn dieser gar nicht benutzt wird?

      Das war natürlich ein dummer copy-paste-Fehler, musste heißen

        
      <?php  
      $hd[]= array ('a2'   => array ('aaaaa',  'a123',  'dfgdf',  'dere', ));  
      $hd[]= array ('a3'   => array ('caaa',  'a4',  'juiof',  'trre', ));  
      $hd[]= array ('b7'   => array ('artaaaa',  'vt',  'ewwwf',  'jkllk', ));  
      ......  
      function getit ($p1)  
        {  
         $e [0] = $hd[$p1][0];  
         $e [1] = $hd[$p1][1];  
         $e [2] = $hd[$p1][2];  
         return $e;  
        }  
        
      $erg = getit ('a3');  
        
      ?>  
      
      

      Ihr seht, ich bin noch am Anfang (war bisher auf der Perl-Schiene).
      Habe jetzt an den Anfang der Funktion
      global $hd; geschreiben, hat aber auch nichts gebracht.

      Mit error_reporting komme ich auch nicht weiter, im Gegenteil:
      Nach einiger Wartezeit kommt "The connection was reset....."
      (bei error_reporting(-1); und error_reporting(E_ALL);

      1. Hi,

        Das war natürlich ein dummer copy-paste-Fehler, musste heißen

        <?php
        $hd[]= array ('a2'   => array ('aaaaa',  'a123',  'dfgdf',  'dere', ));
        $hd[]= array ('a3'   => array ('caaa',  'a4',  'juiof',  'trre', ));
        $hd[]= array ('b7'   => array ('artaaaa',  'vt',  'ewwwf',  'jkllk', ));
        ......
        function getit ($p1)
          {
           $e [0] = $hd[$p1][0];
           $e [1] = $hd[$p1][1];
           $e [2] = $hd[$p1][2];
           return $e;
          }

        $erg = getit ('a3');

        ?>

          
        
        > Habe jetzt an den Anfang der Funktion  
        > global $hd; geschreiben, hat aber auch nichts gebracht.  
          
        Kann es auch nicht.  
        Damit mag zwar $hd der Funktion jetzt bekannt sein (auch wenn global alles andere als empfehlenswert ist) – aber $hd hat immer noch kein Element, dass unter dem Key 'a3' ansprechbar wäre.  
          
        Nutze mal print\_r oder var\_dump, um dir anzuschauen, wie dein Array \*wirklich\* aufgebaut ist.  
          
        
        > Mit error\_reporting komme ich auch nicht weiter, im Gegenteil:  
        > Nach einiger Wartezeit kommt "The connection was reset....."  
        > (bei error\_reporting(-1); und error\_reporting(E\_ALL);  
          
        Beschreibe bitte, was genau du gemacht hast, um es einzustellen.  
          
        Und kümmere dich darum bitte zuerst – damit kann PHP dir nämlich eine ganze menge Fehler selber mitteilen, ohne dass du erst hier mit „das funzt nich“ und „das funzt imma noch nich“ angerannt kommen musst.  
          
        
        > Ihr seht, ich bin noch am Anfang (war bisher auf der Perl-Schiene).  
          
        Und weil du auf der permanent entgleist bist, hast du dich jetzt PHP zugewendet – oder warum …?  
          
        MfG ChrisB  
          
        
        -- 
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        
  3. Hallo Benni,

    streng genommen gibt es in PHP kein mehrdimensionales Feld. Auch der Begriff "assoziativ" ist hinsichtlich des Konzepts von PHP Arrays nicht korrekt, bzw. nicht nötig. Ein PHP Array ist im Prinzip eine HASHMAP, die Schlüsseln Werte zuweist. Wie der Schlüssel aussieht, ist egal. D.h, es kann ein fortlaufender Integerwert genauso sein, wie alphanumerische Werte, Datumsangaben, etc.

    Dieses Konzept erlaubt Verschachtelung, und damit kann man verschiedene Dinge simulieren: Felder, Hash-Tabellen, Stacks, etc.

    Ein kurzes Beispiel

      
    $t = array();  
    $t[3] = "testwert;  
    echo count($t);  
    
    

    ergibt 1 (dem Schlüssel 3 wurde de Wert "testwert" zugewiesen)

      
    t = new Array();  
    t[3] = "testwert";  
    alert(t.length);  
    
    

    ergibt 3 (hier wurden die Feldbereiche 0,1, und 2 implizit zum Feld hinzugefügt. Ein Standard-Feld beginnt immer beim numerischen Index 0. 0-2 sind allerdings undefined.)

    In Java wäre sowas nicht möglich, dort müsste man die Feldgröße implizt durch initiales Setzen von Werten oder explizit durch die Angabe des Maxwertes festlegen.
    Pseudo
    int t[] = new int[5];
    t[3] = "testwert";
    Javas Vectoren verhalten sich wohl etwas ähnlich wie PHP Arrays.

    Man sollte dieses Verhalten von PHP hinslichtlich Arrays berücksichtigen. Wie agiert PERL in diese Hinsicht? Auch bei Python gibt es keine Felder im Sinne von C, sondern das Konzept von Listen und Dicts.

    Auch wenn man PHP nicht mag, finde ich dieses Konzept trotzdem sehr anwenderfreundlich. Java- oder C-Arrays können u.U. ne Menge Ärger bereiten. Deshalbt greift man im Falle von Java wohl auch oft zu dem Konzept der Vektoren oder der ArrayLists.

    1.   
      t = new Array();  
      t[3] = "testwert";  
      alert(t.length);  
      
      

      ergibt natürlich 4, sorry für den Tippfehler.