Frage

In php, ich muss oft die Karte eine variable mit einem array ...aber ich kann nicht scheinen, um in der Lage sein, dies zu tun in einem one-liner.c.f.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];

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

War es hilfreich?

Lösung

Ich würde nicht sorgen über, dass zusätzliche variable, wirklich.Wenn Sie wollen, aber Sie könnten auch entfernen Sie es aus dem Speicher, nachdem Sie es benutzt:

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

Oder, Sie könnte schreiben Sie eine kleine Funktion:

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

und rufen Sie diese mit:

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

Sollte das array zerstört werden nun automatisch.

Andere Tipps

Die technische Antwort ist, dass die Grammatik der PHP-Sprache erlaubt nur subskript-notation am Ende variable Ausdrücke und nicht Ausdrücke in Allgemeinen, das ist, wie es funktioniert in den meisten anderen Sprachen.Ich habe Sie immer betrachtet als ein Mangel in der Sprache, da es möglich ist, eine Grammatik, löst tiefgestellte Zeichen gegen jegliche Ausdruck eindeutig.Es könnte der Fall sein, ist jedoch, dass Sie mit einem starr-parser-generator, oder Sie einfach nicht wollen, zu brechen, eine Art rückwärts-Kompatibilität.

Hier sind ein paar weitere Beispiele für ungültige tiefgestellte Zeichen zu gültigen Ausdrücken:

$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.Es wurde Hinzugefügt in php 5.4.http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

update[2012-11-25]: as of PHP 5.5, Dereferenzierung wurde Hinzugefügt contants/strings als auch arrays

Dies ist möglicherweise nicht direkt mit..Aber ich kam, um diesen Beitrag zu finden Lösung für dieses spezielle problem Auftritt.

Bekam ich ein Ergebnis von einer Funktion in die folgende form.

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

was ich wollte, war die parent_id Wert "9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a".Ich benutzte die Funktion wie folgt und bekam es auch.

array_pop( array_pop( the_function_which_returned_the_above_array() ) )

Es war also done in one line :) Hoffe, Es wäre hilfreich für jemanden.

function doSomething()
{
    return $somearray;
}

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

tatsächlich, es ist eine elegante Lösung:) Der folgenden weisen das 3. element des Arrays zurückgegeben, die von myfunc zu $myvar:

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

Oder so, wenn Sie müssen die array-Wert in einer variable

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

Es gibt mehrere oneliners Sie konnte, mit Hilfe von php array_* Funktionen.Aber ich versichere Ihnen, dass zu tun, also es ist total überflüssig zu vergleichen, was Sie erreichen wollen.

B. Sie können etwas wie folgt, aber es ist keine elegante Lösung und ich bin mir nicht sicher über die Leistung von diese;

   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 und stecken Sie mit einer älteren version von php, die meisten frameworks hat, helfen Bibliotheken.

Beispiel:Codeigniter-array-Helfer

obwohl die Tatsache, dass die Dereferenzierung wurde Hinzugefügt in PHP >=5.4 Sie könnte es getan haben, in eine Linie mit ternärer operator:

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

auf diese Weise haben Sie nicht halten Sie das array nur die variable.und Sie benötigen keine zusätzlichen Funktionen, es zu tun...Wenn diese Zeile in einer Funktion verwendet, so wird automatisch am Ende vernichtet Sie können aber auch zerstört es sich selbst, wie gesagt, mit unset später in den code, wenn es ist nicht in einer Funktion verwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top