Использование фигурных скобок с динамическими именами переменных в PHP - PullRequest
169 голосов
/ 13 февраля 2012

Я пытаюсь использовать имена динамических переменных (я не уверен, как они на самом деле называются), но примерно так:

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

var_dump($file0);

Возвращаемое значение null, которое говорит мне, что оно не работает. Я понятия не имею, какой здесь синтаксис или техника, которую я ищу, что затрудняет исследование. $filelist определено ранее.

Ответы [ 8 ]

461 голосов
/ 13 февраля 2012

Оберните их в {}:

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

Рабочий пример


Использование ${} - это способ создания динамических переменных, простой пример:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there
70 голосов
/ 03 марта 2016

Обзор

В PHP вы можете просто поставить дополнительный $ перед переменной, чтобы сделать ее динамической переменной:

$$variableName = $value;

Хотя я бы не советовал, вы можете даже связать это поведение:

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

Вы можете, но не обязаны ставить $variableName между {}:

${$variableName} = $value;

Использование {} является обязательным только в том случае, если имя вашей переменной само является композицией из нескольких значений, например:

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

Тем не менее, рекомендуется всегда использовать {}, потому что он более читабелен.

Различия между PHP5 и PHP7

Еще одна причина всегда использовать {} заключается в том, что PHP5 и PHP7 имеют несколько иной способ работы с динамическими переменными, что в некоторых случаях приводит к разным результатам.

В PHP7 динамические переменные, свойства и методы теперь будут оцениваться строго в порядке слева направо, в отличие от сочетания особых случаев в PHP5. Приведенные ниже примеры показывают, как изменился порядок оценки.

Дело 1: $$foo['bar']['baz']

  • Интерпретация PHP5: ${$foo['bar']['baz']}
  • Интерпретация PHP7: ${$foo}['bar']['baz']

Случай 2: $foo->$bar['baz']

  • PHP5 интерпретация: $foo->{$bar['baz']}
  • Интерпретация PHP7: $foo->{$bar}['baz']

Дело 3: $foo->$bar['baz']()

  • PHP5-интерпретация: $foo->{$bar['baz']}()
  • Интерпретация PHP7: $foo->{$bar}['baz']()

Дело 4: Foo::$bar['baz']()

  • Интерпретация PHP5: Foo::{$bar['baz']}()
  • Интерпретация PHP7: Foo::{$bar}['baz']()
20 голосов
/ 13 февраля 2012

Попробуйте использовать {} вместо ():

${"file".$i} = file($filelist[$i]);
4 голосов
/ 16 января 2013

Я делаю это довольно часто для результатов, возвращаемых из запроса ..

, например

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

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

Теперь я могу просто использовать $ MyFieldname (что проще в выражениях echo и т. Д.) Вместо $ MyQueryResult ['MyFieldname']

Да, наверное, лень, но у меня никогда не было проблем.

2 голосов
/ 30 мая 2013

Том, если у вас есть существующий массив, вы можете преобразовать этот массив в объект и использовать его следующим образом:

$r = (object) $MyQueryResult;
echo $r->key;
0 голосов
/ 15 февраля 2019

Попробуйте использовать {} вместо ():

${"file".$i} = file($filelist[$i]);
0 голосов
/ 10 ноября 2015

Я находился в положении, когда у меня было 6 одинаковых массивов, и мне нужно было выбрать правильный, в зависимости от другой переменной, и затем присвоить ей значения. В показанном здесь случае $ comp_cat был 'a', поэтому мне нужно было выбрать массив 'a' (у меня, конечно, также были массивы от 'b' до 'f')

Обратите внимание, что значения для позиции переменной в массиве идут после закрывающей скобки.

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

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

echo 'Первым значением массива является'. $ Comp_cat_a_arr [1] [0]. ' и второе значение: $ comp_cat_a_arr [1] [1];

0 голосов
/ 12 мая 2015

У меня есть решение для динамически созданного значения переменной и объединил все значения в переменной.

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