Domanda

In php, spesso ho bisogno di mappare una variabile usando un array...ma non riesco a farlo in una sola battuta.cfr.esempio:

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

Questo è un problema minore, ma continua a dare fastidio ogni tanto...Non mi piace il fatto che utilizzo una variabile senza scopo ;)

È stato utile?

Soluzione

Non mi preoccuperei di quella variabile extra, davvero.Se vuoi, però, puoi anche rimuoverlo dalla memoria dopo averlo utilizzato:

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

Oppure potresti scrivere una piccola funzione:

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

e chiamalo con:

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

L'array dovrebbe essere distrutto automaticamente ora.

Altri suggerimenti

La risposta tecnica è che il Grammatica del linguaggio PHP consente solo la notazione in pedice alla fine di espressioni variabili e non espressioni in generale, ed è così che funziona nella maggior parte delle altre lingue.L'ho sempre considerata una carenza della lingua, perché è possibile avere una grammatica che risolva i pedici di qualsiasi espressione in modo inequivocabile.Potrebbe essere il caso, tuttavia, che stiano utilizzando un generatore di parser inflessibile o semplicemente non vogliano interrompere una sorta di compatibilità con le versioni precedenti.

Ecco un altro paio di esempi di pedici non validi su espressioni valide:

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

Questo si chiama dereferenziazione dell'array.È stato aggiunto in PHP 5.4.http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

aggiornamento[2012-11-25]: a partire da PHP 5.5, il dereferenziamento è stato aggiunto ai costanti/stringhe così come agli array

Questo potrebbe non essere direttamente correlato..Ma sono arrivato a questo post per trovare una soluzione a questo problema specifico.

Ho ottenuto un risultato da una funzione nel seguente modulo.

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

quello che volevo era il valore parent_id "9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a".Ho usato la funzione in questo modo e l'ho ottenuta.

array_pop( array_pop( the_function_which_returned_the_above_array() ) )

Quindi, è stato fatto in una riga :) Spero che sia utile a qualcuno.

function doSomething()
{
    return $somearray;
}

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

in realtà, esiste una soluzione elegante :) Quanto segue assegnerà il terzo elemento dell'array restituito da myfunc a $myvar:

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

O qualcosa del genere, se hai bisogno del valore dell'array in una variabile

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

Ce ne sono diversi oneliner potresti inventarti, usando php vettore_* funzioni.Ma ti assicuro che farlo è totalmente ridondante rispetto a ciò che vuoi ottenere.

Nell'esempio puoi usare qualcosa come il seguente, ma non è una soluzione elegante e non sono sicuro delle prestazioni di questo;

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

se stai utilizzando un framework php e sei bloccato con una versione precedente di php, la maggior parte dei framework dispone di librerie di aiuto.

esempio:Aiutanti dell'array Codeigniter

sebbene il fatto che il dereferenziamento sia stato aggiunto in PHP >=5.4 avresti potuto farlo in una riga utilizzando l'operatore ternario:

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

in questo modo non mantieni l'array ma solo la variabile.e non hai bisogno di funzioni extra per farlo...Se questa riga viene utilizzata in una funzione verrà automaticamente distrutta alla fine ma puoi anche distruggerla tu stesso come detto con unset più avanti nel codice se non viene utilizzato in una funzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top