PHP: Zugriff auf Array Value on the Fly

In PHP muss ich oft eine Variable mit einem Array abbilden … aber ich kann nicht in der Lage sein, dies in einem einzigen Liner zu tun. Beispiel:

// the following results in an error: echo array('a','b','c')[$key]; // this works, using an unnecessary variable: $variable = array('a','b','c'); echo $variable[$key]; 

Das ist ein kleines Problem, aber es nervt immer wieder ab … Ich mag die Tatsache nicht, dass ich eine Variable für nichts verwende;)

   

Ich würde mich wirklich nicht um diese zusätzliche Variable kümmern. Wenn Sie möchten, können Sie es auch aus dem Speicher entfernen, nachdem Sie es verwendet haben:

 $variable = array('a','b','c'); echo $variable[$key]; unset($variable); 

Oder Sie könnten eine kleine function schreiben:

 function indexonce(&$ar, $index) { return $ar[$index]; } 

und nenne das mit:

 $something = indexonce(array('a', 'b', 'c'), 2); 

Das Array sollte jetzt automatisch zerstört werden.

Die technische Antwort ist, dass die Grammatik der PHP-Sprache nur eine tiefgestellte Notation am Ende von Variablenexpress erlaubt und keine Ausdrücke im Allgemeinen, so wie es in den meisten anderen Sprachen funktioniert. Ich habe es immer als einen Mangel in der Sprache angesehen, weil es möglich ist, eine Grammatik zu haben, die tiefgestellte Zeichen gegen jeden Ausdruck eindeutig triggers. Es könnte jedoch der Fall sein, dass sie einen unflexiblen Parsergenerator verwenden oder einfach keine Rückwärtskompatibilität brechen wollen.

Hier sind einige Beispiele für ungültige Indizes für gültige Ausdrücke:

 $x = array(1,2,3); print ($x)[1]; //illegal, on a parenthetical expression, not a variable exp. function ret($foo) { return $foo; } echo ret($x)[1]; // illegal, on a call expression, not a variable exp. 

Dies wird als Array-Dereferenzierung bezeichnet. Es wurde in PHP 5.4 hinzugefügt. http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

update [2012-11-25]: Seit PHP 5.5 wurde die Dereferenzierung sowohl in contants / strings als auch in Arrays hinzugefügt

Das ist vielleicht nicht direkt damit verbunden. Aber ich bin zu diesem Post gekommen, um eine Lösung für dieses spezielle Problem zu finden.

Ich habe ein Ergebnis von einer function in der folgenden Form.

 Array ( [School] => Array ( [parent_id] => 9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a ) ) 

Was ich wollte, war der parent_id Wert “9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a”. Ich habe die function so benutzt und verstanden.

 array_pop( array_pop( the_function_which_returned_the_above_array() ) ) 

Also, es wurde in einer Zeile gemacht 🙂 Hope Es wäre hilfreich für jemanden.

 function doSomething() { return $somearray; } echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject(); 

tatsächlich gibt es eine elegante Lösung 🙂 Im Folgenden wird das dritte Element des Arrays, das von myfunc zurückgegeben wird, $ myvar zugewiesen:

 $myvar = array_shift(array_splice(myfunc(),2)); 

Oder so etwas, wenn Sie den Array-Wert in einer Variablen benötigen

 $variable = array('a','b','c'); $variable = $variable[$key]; 

Es gibt mehrere oneliner, die Sie mit php array_ * functionen verwenden könnten . Aber ich versichere Ihnen, dass es absolut überflüssig ist, zu vergleichen, was Sie erreichen wollen.

Beispiel Sie können etwas wie folgt verwenden, aber es ist keine elegante Lösung und ich bin mir nicht sicher über die performance davon;

  array_pop ( array_filter( array_returning_func(), function($key){ return $key=="array_index_you_want"? TRUE:FALSE; },ARRAY_FILTER_USE_KEY ) ); 

Wenn Sie ein PHP-Framework verwenden und Sie mit einer älteren Version von PHP festgefahren sind, unterstützen die meisten Frameworks Bibliotheken.

Beispiel: Codeigniter-Array-Helfer

obwohl die Tatsache, dass Dereferenzierung in PHP> = 5.4 hinzugefügt wurde, hätte man es in einer Zeile mit dem ternären Operator machen können:

 echo $var=($var=array(0,1,2,3))?$var[3]:false; 

Auf diese Weise behalten Sie das Array nicht nur die Variable. und Sie brauchen keine zusätzlichen functionen, um es zu tun … Wenn diese Zeile in einer function verwendet wird, wird sie am Ende automatisch zerstört, aber Sie können sie auch selbst zerstören, wie später im Code, wenn sie nicht verwendet wird in einer function.