Usando chaves com nomes de variáveis ​​dinâmicas em PHP

191

Estou tentando usar nomes de variáveis ​​dinâmicas (não tenho certeza do que eles realmente são chamados), mas praticamente assim:

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

var_dump($file0);

O retorno é o nullque me diz que não está funcionando. Não tenho idéia de qual é a sintaxe ou a técnica que estou procurando, o que dificulta a pesquisa. $filelisté definido anteriormente.

user1159454
fonte
22
Não ! Nunca há uma boa razão para usá-los. Eles são, efetivamente, apenas uma matriz desarrumada. Use uma matriz adequada.
Quentin
Tudo bem me desculpe, acabei de voltar e escolhi uma resposta para cada pergunta que fiz até agora.
Ainda
2
E Quentin, por que eles são más práticas? Deve haver uma razão que coexistir com matrizes eu pensaria
user1159454
@ user1159454 - Eles são uma bagunça desorganizada sem todas as ferramentas que podem ser aplicadas às matrizes disponíveis para eles. Eles existem por motivos antigos e antigos e casos extremos.
Quentin
8
Casos extremos podem ser exatamente o motivo de alguém querer fazer essa pergunta.
Vincent

Respostas:

511

Envolva-os em {}:

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

Exemplo de trabalho


Usar ${}é uma maneira de criar variáveis ​​dinâmicas, exemplo simples:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there
Sarfraz
fonte
4
Também é possível criar matrizes dinâmicas com a mesma lógica?
dtakis
Tenho a mesma dúvida de @dtakis, você pode nos ajudar? Se possível, dê uma olhada nesta pergunta .
Marcio Mazzucato
Apenas um aviso, se você estiver usando isso para incluir uma variável (a maneira mais útil de IMHO), não se esqueça de usar aspas duplas. ${'fixedTime$i'} = $row['timeInstance'];dá-lhe um não é muito útil $fixedTime$i, em vez de $fixedTime1, $fixedTime2etc. (Felizmente visto quase de imediato.)
Benice
81

Visão geral

No PHP, você pode simplesmente colocar um extra $na frente de uma variável para torná-la uma variável dinâmica:

$$variableName = $value;

Embora eu não recomende, você pode encadear esse comportamento:

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

Você pode, mas não é forçado a colocar $variableNameentre {}:

${$variableName} = $value;

O uso {}é obrigatório apenas quando o nome da sua variável é uma composição de vários valores, como este:

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

No entanto, é recomendável usar sempre {}, porque é mais legível.

Diferenças entre PHP5 e PHP7

Outro motivo para usar sempre {}é que o PHP5 e o PHP7 têm uma maneira ligeiramente diferente de lidar com variáveis ​​dinâmicas, o que resulta em um resultado diferente em alguns casos.

No PHP7, variáveis ​​dinâmicas, propriedades e métodos agora serão avaliados estritamente na ordem da esquerda para a direita, em oposição à combinação de casos especiais no PHP5. Os exemplos abaixo mostram como a ordem da avaliação mudou.

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

  • Interpetação PHP5: ${$foo['bar']['baz']}
  • Interpetação do PHP7: ${$foo}['bar']['baz']

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

  • Interpetação PHP5: $foo->{$bar['baz']}
  • Interpetação do PHP7: $foo->{$bar}['baz']

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

  • Interpetação PHP5: $foo->{$bar['baz']}()
  • Interpetação do PHP7: $foo->{$bar}['baz']()

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

  • Interpetação PHP5: Foo::{$bar['baz']}()
  • Interpetação do PHP7: Foo::{$bar}['baz']()
John Slegers
fonte
6
Uma boa resposta para um tópico duvidoso. Estou muito feliz por não precisar depurar esse código.
martinstoeckli
4
melhor resposta, uma vez que apenas responde à pergunta, sem ser crítico
Rid Iculous
2
Sim, também tivemos alguns problemas com algum código legado. A produção foi PHP5.5, o ambiente Dev foi PHP7. Estou favorecendo esta questão.
Ogier Schelvis
20

Tente usar em {}vez de ():

${"file".$i} = file($filelist[$i]);
Joakim Johansson
fonte
1
do manual phpNET php.net/manual/ru/language.variables.variable.php $price_for_monday = 10; $price_for_tuesday = 20; $today = 'tuesday'; $price_for_today = ${ 'price_for_' . $today}; echo $price_for_today; // will return 20
Vladimir Ch
5

Faço isso com bastante frequência nos resultados retornados de uma consulta ..

por exemplo

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

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

Agora eu posso apenas usar $ MyFieldname (que é mais fácil nas instruções de eco, etc.) em vez de $ MyQueryResult ['MyFieldname']

Sim, provavelmente é preguiçoso, mas nunca tive problemas.

Tom
fonte
14
Você já tentou usar a função extract () do PHP? php.net/manual/en/function.extract.php
DarkSide 10/10
1
calhar one-liner para conjuntos de resultados DB: foreach ($ row quanto $ k => $ v) {$$ k = $ v}
Rid Iculous
2

Tom, se você tiver um array existente, poderá convertê-lo em objeto e usá-lo assim:

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

Eu tenho uma solução para o valor variável criado dinamicamente e combinado todo o valor em uma variável.

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

Eu estava em uma posição em que tinha 6 matrizes idênticas e precisava escolher a correta, dependendo de outra variável e depois atribuir valores a ela. No caso mostrado aqui, $ comp_cat era 'a', então eu precisava escolher minha matriz 'a' (eu também tinha matrizes 'b' a 'f')

Observe que os valores para a posição da variável na matriz vão depois da chave de fechamento.

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

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

echo 'O primeiro valor da matriz é'. $ comp_cat_a_arr [1] [0]. ' e o segundo valor é. $ comp_cat_a_arr [1] [1];

M61Vulcan
fonte
0

Tente usar {} em vez de ():

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