2012-03-26 7 views
1

Ich versuche, einen Wert in einem Array innerhalb eines Objekts dynamisch zu verwenden.

In meinem speziellen Fall habe ich ein Array wie folgt.

$this->customer = array(
    [dealerId] => 4 
    [billFirstName] => Joe 
    [billLastName] => Blo 
    [billAddress1] => 1010s  
    [billAddress2] => 1020s 
    [billCity] => Anytown 
    [billState] => ST 
    [billCountry] => USA 
    [billPostalCode] => 11111 
    [dEmail] => emailaddress 
    [billPhone] => 8008008888 
    [password] => password 
    [distPrice] => 5 
    [distCost] => 20); 

$result = $this->keyCheck('dealerId', 'customer'); 

Die Methode Ich verwende:

protected function keyCheck($key, $array, $type = false) 
    { 
     if(array_key_exists($key, $this->$array) && $this->$array[$key]): 
     return $this->$array[$key]; 
     else: 
     return $type; 
     endif; 
    } 

Die ersten Kontrollarbeiten (array_key_exists ($ key, $ this -> $ array)). Aber die zweite Überprüfung schlägt fehl ($ this -> $ array [$ key]), obwohl in diesem Index des Arrays ein Wert enthalten ist. Ich habe bewiesen, dass das Array in der Methode keyCheck() existiert, indem man print_r ($ this -> $ array) verwendet; innerhalb der Methode. Und ich weiß, dass der Wert, nach dem ich suche, in der Methode verfügbar ist, indem man $ this -> $ array ['dealerId'] verwendet;

Lassen Sie sich nicht von den Namen oder der verwendeten Methodik hängen, was mich wirklich interessiert, ist herauszufinden, wie man einen Wert in einem Array anspricht, das auf diese Weise dynamisch adressiert wird.

Es ist wahrscheinlich so einfach, dass ich meinen Kopf werden Slapping werde, sobald es geoffenbart ...

+1

Sie besser Var_dump den Teil innerhalb der if-Anweisung hatten Sie sind verdächtig und sehen, was Sie erhalten. print_r darf NULL-Werten nicht vertrauen. – Melsi

+0

Wie wäre es mit isset()? ändert es etwas? –

+0

Danke, ich habe das versucht, und es gibt keine null-Werte im Array. Der Test innerhalb der Methode "print $ this -> $ array ['dealerId']" erzeugt den Wert, nach dem ich suche, aber die Adressierung des Indexes mit einer Variablen aus irgendeinem Grund funktioniert nicht. – Foaminator

Antwort

4

Sie sind als Array Falle, in die gefürchtete treat Schnur läuft, dh:

$str = 'customer'; echo $str[0]; // prints c 

der $array[$key] Teil $this->$array[$key] wird interpretiert als zeigen mir die n-te Index der Zeichenfolge $ array (wenn Sie customer passieren wird es versuchen, $this->c zuzugreifen, die nicht existiert). Weisen Sie das Array zuerst einer Variablen zu. Hier ein Beispiel:

class A 
{ 
    public $customer = array('dealerId'=>4, 'billFirstName'=>'Joe'); 

    public function keyCheck($key, $arrayName, $type = false) 
    { 
     $array = $this->$arrayName; 
     if(array_key_exists($key, $array) && $array[$key]) { 
      return $array[$key]; 
     } else { 
      return $type; 
     } 
    } 
} 

$a = new A(); 
echo $a->keyCheck('billFirstName', 'customer'); // Joe 

Alternativ können Sie die komplexe Syntax: $this->{$arrayName}[$key] wie in Artjom Antwort vorgeschlagen.

PHP 5.4 addresses this gotcha:

[In PHP 5.4] Non-numeric string offsets - e.g. $a['foo'] where $a is a string - now return false on isset() and true on empty(), and produce a E_WARNING if you try to use them.

Diese E_WARNING sollten Entwickler helfen, schnell die Ursache viel mehr aufzuspüren.

+0

Gah !!!!! Das ist es! Vielen Dank! – Foaminator

+0

Gern geschehen. Bitte upvote und Häkchen, wenn Sie können! Ich werde weitere Informationen hinzufügen. – webbiedave

+0

Ich würde Ihnen eine UP "Nützliche Antwort" geben, aber ich habe noch nicht genügend Rep für das. :) – Foaminator

1

Nun müssen u verwenden

$this->{$array}[$key]; 
+0

Interessanter Fehler, wenn ich versuche, dass ... "Catachable fataler Fehler: Objekt der Klasse Customer konnte nicht in Zeichenfolge in /home/classes/Basic.class.php in Zeile 159 konvertiert werden" – Foaminator

+0

In der Tat, weil es gut ging php 5.3.9 –

+0

Seltsam.Diese Syntax sollte so früh wie 5.2 (und sogar früher) funktionieren. – webbiedave