2008-08-16 5 views
47

In PHP muss ich oft eine Variable mit einem Array zuordnen ... aber ich kann nicht in der Lage sein, dies in einem einzigen Liner zu tun. c.f. Beispiel:PHP: Access Array Wert im Flug

// 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]; 

Dies ist ein kleines Problem, aber es hält jeder einmal in eine Weile nervt ... Ich mag die Tatsache nicht, dass ich eine Variable für nichts verwenden;)

+4

Works als der 'PHP v5.4', illegale Syntax in' PHP <= v5.3' –

Antwort

15

I wouldn Kümmere dich nicht um diese zusätzliche Variable, wirklich. Wenn Sie wollen, obwohl, können Sie auch aus dem Speicher entfernen, nachdem Sie es verwendet haben:

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

Oder könnten Sie eine kleine Funktion schreiben:

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

und nennen dies mit:

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

Das Array sollte jetzt automatisch zerstört werden.

+0

@onnodb, 'strenge Standards: Es sollten nur Variablen von reference' geben werden für Ihre Funktion 'indexonce'. Warum fügen Sie die '&' Referenz hinzu? – Pacerier

38

Die technische Antwort ist, dass die Grammatik der PHP-Sprache Index-Notation nur auf dem Ende variable Ausdrücke und nicht Ausdrücke im Allgemeinen erlaubt, das ist, wie es in den meisten anderen Sprachen. 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 löst. Es könnte jedoch der Fall sein, dass sie einen unflexiblen Parsergenerator verwenden oder einfach keine Rückwärtskompatibilität brechen wollen.

Hier ein paar weitere Beispiele für ungültigen Indizes auf gültige Ausdrücke sind:

$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. 
+2

Es gab einen Änderungsvorschlag zumindest für die zweite Syntax, aber es wurde abgelehnt: http://wiki.php.net/rfc/functionarraydereferencing – Max

+11

Status ist jetzt geändert zu akzeptiert http://wiki.php.net/rfc/ functionarraydereferencing –

+3

Diese Antwort ist nicht mehr korrekt. Ab 5.5 unterstützt PHP Konstanten-/Array-/String-Dereferenzierung https://wiki.php.net/rfc/constdereference – Mbrevda

0

Oder so etwas wie, wenn Sie den Array-Wert in einer Variablen

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

brauchen es tatsächlich, ist eine elegante Lösung :) Im Folgenden wird das dritte Element des von myfunc zurückgegebenen Arrays $ myvar zugewiesen:

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

Clever? Ja! Elegant? Nein. –

2
function doSomething() 
{ 
    return $somearray; 
} 

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject(); 
+0

Wie können Sie 'get (1)' auf einem Array erstellen? Schwerwiegender Fehler: Aufruf einer Member-Funktion get() für ein Nicht-Objekt in Datei.php in Zeile 21 – Pacerier

5

Dies könnte nicht direkt in Beziehung gesetzt werden .. Aber ich kam zu Diese Post finden Lösung für dieses spezielle Problem.

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

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

, was ich war der parent_id Wert "9ce8e78a-F4CC-ff64-8de0-4d9c1819a56a" wollte. Ich habe die Funktion so benutzt und verstanden.

array_pop(array_pop(the_function_which_returned_the_above_array())) 

So war es in einer Zeile fertig :) Hoffen, dass es hilfreich für jemanden sein würde.

+0

Dies funktioniert nur beim letzten Wert, und Sie werden den Wert aus dem ** ursprünglichen Array ** entfernen. – Pacerier

0

Es gibt mehrere oneliners Sie einfiel, php array_ * Funktionen. 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 Leistung 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 mit einer älteren Version von PHP stecken geblieben sind, hat die meisten Frameworks Bibliotheken zu helfen.

Beispiel: Codeigniter Array Helfer