Vra

In php, moet ek dikwels om 'n veranderlike met behulp van 'n verskeidenheid te karteer ... maar ek kan nie lyk om in staat wees om dit te doen in 'n een sak. C. F. Byvoorbeeld:

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

Dit is 'n klein probleem, maar dit hou afluister elke keer in 'n rukkie ... Ek hou nie van die feit dat ek 'n veranderlike vir niks;)

Was dit nuttig?

Oplossing

Ek sou nie die moeite oor daardie ekstra veranderlike, regtig. As jy wil, al is, jy kan ook verwyder uit geheue nadat jy dit gebruik het:

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

Of, kan jy 'n klein funksie te skryf:

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

en noem dit met:

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

Die skikking moet outomaties nou vernietig word.

Ander wenke

Die tegniese antwoord is dat die Grammar van die PHP taal kan net onderskrif notasie op die einde van veranderlike uitdrukkings en nie uitdrukkings in die algemeen, en dit is hoe dit werk in die meeste ander tale. Ek het nog altyd beskou dit as 'n tekort in die taal, omdat dit moontlik is om 'n grammatika wat onderskrifte ondubbelsinnig besluit teen enige uitdrukking het. Dit kan die geval wees, maar dat hulle met 'n onbuigsame parser generator of hulle het eenvoudig nie wil 'n soort van backwards compatibility breek.

Hier is 'n paar voorbeelde van ongeldig onderskrifte op geldige uitdrukking:

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

Dit is die sogenaamde skikking dereferencing. Dit is bygevoeg in PHP 5.4. http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

update [2012/11/25]: as van PHP 5.5, dereferencing is bygevoeg om constanten / snare sowel as skikkings

Dit kan nie direk verband hou .. Maar ek het gekom om hierdie post bevinding oplossing vir hierdie spesifieke probleem.

Ek het 'n gevolg van 'n funksie in die volgende vorm.

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

wat ek wou was die parent_id waarde "9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a". Ek gebruik die funksie soos hierdie en het dit.

array_pop( array_pop( the_function_which_returned_the_above_array() ) )

So, Dit is gedoen in 'n lyn :) Hoop dit sal nuttig wees om iemand te wees.

function doSomething()
{
    return $somearray;
}

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

eintlik, daar is 'n elegante oplossing :) Die volgende die 3de element van die skikking deur myfunc terug na $ myvar sal toewys:

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

Of so iets, as jy die skikking waarde moet in 'n veranderlike

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

Daar is 'n hele paar Slag Zinnen jy kan kom met, die gebruik van PHP skikking _ * funksies. Maar ek kan jou verseker dat dit te doen dit is totaal oorbodig te vergelyk wat jy wil bereik.

Voorbeeld jy kan iets gebruik soos volg, maar dit is nie 'n elegante oplossing en ek is nie seker oor die prestasie van hierdie

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

As jy 'n PHP raamwerk en jy is vas met 'n ouer weergawe van PHP, mees raamwerke het gehelp biblioteke.

Byvoorbeeld: CodeIgniter verskeidenheid helpers

alhoewel die feit dat dereferencing is bygevoeg in PHP> = 5.4 jy kan dit gedoen het in 'n lyn met behulp van drieledige operateur:

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

hierdie manier wat jy nie die skikking net die veranderlike. en jy hoef nie ekstra funksies om dit te doen ... As hierdie lyn word gebruik in 'n funksie sal outomaties aan die einde vernietig, maar jy kan ook vernietig dit self as gesê met unset later in die kode indien dit nie gebruik word nie in 'n funksie.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top