Usar llaves con nombres de variables dinámicas en PHP

191

Estoy tratando de usar nombres de variables dinámicas (no estoy seguro de cómo se llaman realmente) Pero más o menos así:

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

var_dump($file0);

El retorno es lo nullque me dice que no está funcionando. No tengo idea de cuál es la sintaxis o la técnica que estoy buscando, lo que dificulta la investigación. $filelistse definió anteriormente

usuario1159454
fuente
22
No hacerlo ! Nunca hay una buena razón para usarlos. Son, efectivamente, solo una matriz desordenada. Use una matriz adecuada en su lugar.
Quentin
Muy bien, lo siento, simplemente regresé y elegí una respuesta para cada pregunta que he hecho hasta ahora. Lo bueno es que solo son las 7: P
user1159454
2
Y Quentin, ¿por qué son malas prácticas? Tiene que haber una razón por la que existen junto a las matrices que lo pensaría
user1159454
@ user1159454: son un desorden desorganizado sin todas las herramientas que se pueden aplicar a las matrices disponibles para ellos. Existen por antiguas razones de legado y casos de borde loco.
Quentin
8
Los casos de borde loco pueden ser exactamente por qué alguien querría hacer esta pregunta.
Vincent

Respuestas:

511

Envuélvelos en {}:

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

Ejemplo de trabajo


Usar ${}es una forma de crear variables dinámicas, ejemplo simple:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there
Sarfraz
fuente
44
¿También es posible crear matrices dinámicas con la misma lógica?
dtakis
Tengo la misma duda de @dtakis, ¿puedes ayudarnos? Si es posible, eche un vistazo a esta pregunta .
Marcio Mazzucato
Solo una advertencia si está usando esto para incluir una variable (la forma más útil en mi humilde opinión) no se olvide de usar comillas dobles. ${'fixedTime$i'} = $row['timeInstance'];le da un no muy útil en $fixedTime$ilugar de $fixedTime1, $fixedTime2etc. (Afortunadamente lo
vi
81

Visión general

En PHP, solo puede poner un extra $delante de una variable para convertirla en una variable dinámica:

$$variableName = $value;

Si bien no lo recomendaría, incluso podría encadenar este comportamiento:

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

Puede, pero no está obligado a poner $variableNameentre {}:

${$variableName} = $value;

El uso {}solo es obligatorio cuando el nombre de su variable es en sí mismo una composición de múltiples valores, como este:

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

Sin embargo, se recomienda usar siempre {}, porque es más legible.

Diferencias entre PHP5 y PHP7

Otra razón para usar siempre {}es que PHP5 y PHP7 tienen una forma ligeramente diferente de tratar con variables dinámicas, lo que resulta en un resultado diferente en algunos casos.

En PHP7, las variables dinámicas, las propiedades y los métodos ahora se evaluarán estrictamente en orden de izquierda a derecha, a diferencia de la combinación de casos especiales en PHP5. Los siguientes ejemplos muestran cómo ha cambiado el orden de evaluación.

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

  • Interpetación PHP5: ${$foo['bar']['baz']}
  • Interpetación PHP7: ${$foo}['bar']['baz']

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

  • Interpetación PHP5: $foo->{$bar['baz']}
  • Interpetación PHP7: $foo->{$bar}['baz']

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

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

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

  • Interpetación PHP5: Foo::{$bar['baz']}()
  • Interpetación PHP7: Foo::{$bar}['baz']()
John Slegers
fuente
66
Una buena respuesta a un tema dudoso. Estoy realmente contento de no tener que depurar dicho código.
martinstoeckli
44
mejor respuesta ya que solo responde a la pregunta sin ser crítico
Rid Iculous
2
Sí, también tuvimos algunos problemas con algunos códigos heredados. La producción fue PHP5.5, el entorno de desarrollo fue PHP7. Estoy favoreciendo esta pregunta.
Ogier Schelvis
20

Intenta usar en {}lugar de ():

${"file".$i} = file($filelist[$i]);
Joakim Johansson
fuente
1
del 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

Hago esto con bastante frecuencia en los resultados devueltos por una consulta.

p.ej

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

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

Ahora puedo usar $ MyFieldname (que es más fácil en declaraciones de eco, etc.) en lugar de $ MyQueryResult ['MyFieldname']

Sí, probablemente sea flojo, pero nunca he tenido ningún problema.

Tom
fuente
14
¿Alguna vez has tratado de usar la función extract () de PHP? php.net/manual/en/function.extract.php
DarkSide
1
práctico de una sola línea para conjuntos de resultados de base de datos: foreach ($ fila como $ k => $ v) {$$ k = $ v}
Rid Iculous
2

Tom, si tienes una matriz existente, puedes convertir esa matriz en objeto y usarla así:

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

Tengo una solución para el valor variable creado dinámicamente y combiné todo el valor en una variable.

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

Estaba en una posición donde tenía 6 matrices idénticas y necesitaba elegir la correcta dependiendo de otra variable y luego asignarle valores. En el caso que se muestra aquí, $ comp_cat era 'a', así que necesitaba elegir mi matriz 'a' (también, por supuesto, tenía matrices 'b' a 'f')

Tenga en cuenta que los valores para la posición de la variable en la matriz van después de la llave de cierre.

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

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

echo 'El primer valor de matriz es'. $ comp_cat_a_arr [1] [0]. ' y el segundo valor es. $ comp_cat_a_arr [1] [1];

M61Vulcan
fuente
0

Intente usar {} en lugar de ():

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