Utilizzo di parentesi graffe con nomi di variabili dinamiche in PHP


191

Sto cercando di usare nomi di variabili dinamiche (non sono sicuro di come siano effettivamente chiamati) Ma praticamente in questo modo:

for($i=0; $i<=2; $i++) {
    $("file" . $i) = file($filelist[$i]);
}

var_dump($file0);

Il ritorno è nullche mi dice che non funziona. Non ho idea di quale sia la sintassi o la tecnica che sto cercando, il che rende difficile la ricerca. $filelistè stato definito in precedenza.


22
Non farlo ! Non c'è mai una buona ragione per usarli. Sono, in effetti, solo una matrice disordinata. Utilizzare invece un array adeguato.
Quentin,

Bene, mi dispiace, sono appena tornato e ho scelto una risposta per ogni domanda che ho posto finora.
Meno male

2
E Quentin, perché sono cattive pratiche ?? Devo esserci un motivo per cui esistono accanto a array che credo
user1159454,

@ user1159454 - Sono un disordine disorganizzato senza tutti gli strumenti che possono essere applicati agli array disponibili. Esistono per antichi motivi ereditari e casi pazzi.
Quentin,

8
I casi pazzi possono essere esattamente il motivo per cui qualcuno vorrebbe porre questa domanda.
Vincent,

Risposte:


512

Avvolgili in {}:

${"file" . $i} = file($filelist[$i]);

Esempio di lavoro


L'utilizzo ${}è un modo per creare variabili dinamiche, semplice esempio:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there

4
È anche possibile creare array dinamici con la stessa logica?
dtakis,

Ho lo stesso dubbio di @dtakis, puoi aiutarci? Se possibile, dai un'occhiata a questa domanda .
Marcio Mazzucato,

Basta un avvertimento se lo si utilizza per includere una variabile (il modo più utile IMHO) non dimenticare di usare le virgolette doppie. ${'fixedTime$i'} = $row['timeInstance'];ti dà un non molto utile $fixedTime$iinvece di $fixedTime1, $fixedTime2ecc. (Fortunatamente notato quasi subito.)
BeNice

82

Panoramica

In PHP, puoi semplicemente mettere un extra $davanti a una variabile per renderla una variabile dinamica:

$$variableName = $value;

Anche se non lo consiglierei, potresti persino concatenare questo comportamento:

$$$$$$$$DoNotTryThisAtHomeKids = $value;

Puoi ma non sei costretto a mettere $variableNametra {}:

${$variableName} = $value;

L'uso {}è obbligatorio solo quando il nome della variabile è esso stesso una composizione di più valori, come questo:

${$variableNamePart1 . $variableNamePart2} = $value;

Si consiglia comunque di utilizzare sempre {}, perché è più leggibile.

Differenze tra PHP5 e PHP7

Un altro motivo da usare sempre {}è che PHP5 e PHP7 hanno un modo leggermente diverso di gestire le variabili dinamiche, il che si traduce in un risultato diverso in alcuni casi.

In PHP7, le variabili dinamiche, le proprietà e i metodi saranno ora valutati rigorosamente nell'ordine da sinistra a destra, al contrario del mix di casi speciali in PHP5. Gli esempi seguenti mostrano come è cambiato l'ordine di valutazione.

Caso 1 : $$foo['bar']['baz']

  • Interpetazione PHP5: ${$foo['bar']['baz']}
  • Interpetazione PHP7: ${$foo}['bar']['baz']

Caso 2: $foo->$bar['baz']

  • Interpetazione PHP5: $foo->{$bar['baz']}
  • Interpetazione PHP7: $foo->{$bar}['baz']

Caso 3: $foo->$bar['baz']()

  • Interpetazione PHP5: $foo->{$bar['baz']}()
  • Interpetazione PHP7: $foo->{$bar}['baz']()

Caso 4: Foo::$bar['baz']()

  • Interpetazione PHP5: Foo::{$bar['baz']}()
  • Interpetazione PHP7: Foo::{$bar}['baz']()

6
Una buona risposta a un argomento controverso. Sono davvero contento di non dover eseguire il debug di tale codice.
martinstoeckli,

4
migliore risposta poiché risponde alla domanda senza essere giudicante
Rid Iculous

2
Sì, abbiamo anche avuto qualche problema con qualche codice legacy. La produzione era PHP5.5, l'ambiente Dev era PHP7. Sto favorendo questa domanda.
Ogier Schelvis,


5

Lo faccio abbastanza spesso sui risultati restituiti da una query ..

per esempio

// $MyQueryResult is an array of results from a query

foreach ($MyQueryResult as $key=>$value)
{
   ${$key}=$value;
}

Ora posso semplicemente usare $ MyFieldname (che è più facile nelle istruzioni echo ecc.) Piuttosto che $ MyQueryResult ['MyFieldname']

Sì, probabilmente è pigro, ma non ho mai avuto problemi.


14
Hai mai provato a usare la funzione extract () di PHP? php.net/manual/en/function.extract.php
DarkSide

1
pratico one-liner per set di risultati DB: foreach ($ row come $ k => $ v) {$$ k = $ v}
Rid Iculous

2

Tom se hai un array esistente puoi convertirlo in oggetto e usarlo in questo modo:

$r = (object) $MyQueryResult;
echo $r->key;

0

ho una soluzione per il valore variabile creato dinamicamente e combinato tutto il valore in una variabile.

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}

0

Ero in una posizione in cui avevo 6 matrici identiche e avevo bisogno di scegliere quella giusta in base a un'altra variabile e quindi assegnare i valori ad essa. Nel caso mostrato qui $ comp_cat era 'a', quindi dovevo scegliere il mio array 'a' (ovviamente avevo anche array da 'b' a 'f')

Si noti che i valori per la posizione della variabile nell'array vanno dopo il controvento di chiusura.

$ {'comp_cat _'. $ comp_cat .'_ arr '} [1] [0] = "FRED BLOGGS";

$ {'comp_cat _'. $ comp_cat .'_ arr '} [1] [1] = $ file_tidy;

echo 'Il primo valore dell'array è'. $ comp_cat_a_arr [1] [0]. ' e il secondo valore è. $ comp_cat_a_arr [1] [1];


0

Prova a utilizzare {} anziché ():

${"file".$i} = file($filelist[$i]);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.