PHP_L4m0r: Hash mit String-Schlüsseln aus Integer-Werten

Hallo!

Angenommen, ich habe in einer Datenbank eine Relation mit einem auto_increment-Integer-Wert als Primärschlüssel. Nun möchte ich ein paar Datensätze herunterladen und ein assoziatives Array bauen, mit dem ich per Primärschlüssel (in logarithmischer Zeit) auf die restlichen Attributwerte der Tupel zugreifen kann.

Folgender Code symbolisiert dies (ohne Datenbank):

$keys = array(500, 501, 600, 700); // Irgend welche Primärschlüssel  
$hash = array(); // Hier soll die Zuordnung Schlüssel => Daten rein  
foreach ($keys as $key)  
	$hash[(string)$key] = array('attribute0' => 'value'); // Irgend welche Daten  

Was ich nun aus Performancegründen nicht möchte ist, dass ein Array mit 701 Elementen angelegt wird, von denen nur die vier Schlüsselelemente belegt sind. Deshalb habe ich beim Zugriff den Schlüssel in string konvertiert.

So weit so gut.

Wenn ich nun aber den Datentyp der Schlüssel abfrage:

foreach ($hash as $key => $value)  
{  
	echo gettype($key);  
	break;  
}

erhalte ich die Ausgabe "integer".

Für mich ist das durchaus irreführend. Ist es nun trotzdem so, dass $hash ein Hash ist oder ist das nun doch ein Array mit 701 Elementen was es aber eben nicht sein soll?

Ich hoffe, dass mir da jemand Auskunft geben kann! :-)

Viele Grüße!
  PHP_L4m0r

  1. Hallo,

    $keys = array(500, 501, 600, 700); // Irgend welche Primärschlüssel

    $hash = array(); // Hier soll die Zuordnung Schlüssel => Daten rein
    foreach ($keys as $key)

    # $key kann im Beispiel nur die Werte 0, 1, 2 und 3 annehmen

    $hash[(string)$key] = array('attribute0' => 'value'); // Irgend welche Daten

    
    > ...  
    > ~~~php
    
    foreach ($hash as $key => $value)  
    
    > {  
    > 	echo gettype($key);  
    > 	break;  
    > }
    
    

    erhalte ich die Ausgabe "integer".

    de facto ein Bug, deren Bedeutung aber gegen NULL tendiert.

    Ist es nun trotzdem so, dass $hash ein Hash ist oder ist das nun doch ein Array mit 701 Elementen was es aber eben nicht sein soll?

    Die strikte Trennung zwischen Hash und Array gibt es bei PHP nicht. All dies ist vom Typ array.
     Wie oben kommentiert, werden nur vier Primärschlüssel angelegt (0, 1, 2 und 3). Generell kannst Du dies aber selbst überprüfen: print_r() oder var_dump(), var_export()

    Gruß aus Berlin!
    eddi

    --
    Ab einem gewissen Erkenntnisstand ist die Versuchung wohl zu groß, in diesem und seinen begleitenden Errungenschaften zu verharren.
    Das nenne ich Aufblick zu den Stufen des Tempels von der geistigen Gosse aus!
  2. Hi,

    Ist es nun trotzdem so, dass $hash ein Hash ist oder ist das nun doch ein Array mit 701 Elementen was es aber eben nicht sein soll?

    Was ist ein Hash? Meinst Du einen Hash table? Wie auch immer, die Antwort ist "Weder noch". Es ist ein Array mit 4 Eintraegen, deren Schluessel Integers sind. Ein Key, der als String im Format eines Standard-Integer-Literals (kurz: nur Ziffern, keine 0 am Anfang) angegeben ist, wird als Integer interpretiert. Dennoch werden keine anderen als diese vier Elemente im Array erzeugt. PHP tickt da anders als etwa C.

    @Edgar:

    de facto ein Bug,

    Es ist "as designed".

    Viele Gruesse,
    der Bademeister

    1. Hi,

      | de facto ein Bug,
      Es ist "as designed".

      ja; wir reden über PHP - ich vergaß... ;)

      Gruß aus Berlin!
      eddi

      --
      Ab einem gewissen Erkenntnisstand ist die Versuchung wohl zu groß, in diesem und seinen begleitenden Errungenschaften zu verharren.
      Das nenne ich Aufblick zu den Stufen des Tempels von der geistigen Gosse aus!