Использование фигурных скобок с именами динамических переменных в PHP
Я пытаюсь использовать имена динамических переменных (я не уверен, что они на самом деле называются), но в значительной степени так:
for($i=0; $i<=2; $i++) {
$("file" . $i) = file($filelist[$i]);
}
var_dump($file0);
возвращение null что говорит мне, что это не работает. Я понятия не имею, какой синтаксис или технику я ищу здесь, что затрудняет исследование. $filelist определен ранее.
7 ответов:
заверните их в
{}:${"file" . $i} = file($filelist[$i]);Пример Работающего
используя
${}- это способ создания динамических переменных, простой пример:${'a' . 'b'} = 'hello there'; echo $ab; // hello there
обзор
в PHP можно просто поставить дополнительный
$перед переменной, чтобы сделать ее динамической переменной:$$variableName = $value;хотя я бы не рекомендовал его, вы могли бы даже цепочку такое поведение:
$$$$$$$$DoNotTryThisAtHomeKids = $value;вы можете, но не обязаны ставить
$variableNameмежду{}:${$variableName} = $value;используя
{}является обязательным только тогда, когда имя переменной само по себе является композицией из нескольких значений, например :${$variableNamePart1 . $variableNamePart2} = $value;тем не менее, рекомендуется всегда использовать
{}, потому что это более читабельным.различия между PHP5 и PHP7
еще одна причина всегда использовать
{}, это то, что PHP5 и PHP7 имеют несколько иной способ работы с динамическими переменными, что приводит к другому результату в некоторых случаях.в PHP7, динамические переменные, свойства и методы будут оцениваться строго слева-направо, как в отличие от сочетания особых случаев в PHP5. Приведенные ниже примеры показывают, как изменился порядок оценки.
Пример 1 :
$$foo['bar']['baz']
- interpetation РНР5 :
${$foo['bar']['baz']}- PHP7 interpetation :
${$foo}['bar']['baz']Пример 2 :
$foo->$bar['baz']
- interpetation РНР5 :
$foo->{$bar['baz']}- PHP7 interpetation :
$foo->{$bar}['baz']корпус 3 :
$foo->$bar['baz']()
- interpetation РНР5 :
$foo->{$bar['baz']}()- PHP7 interpetation :
$foo->{$bar}['baz']()пример 4 :
Foo::$bar['baz']()
- interpetation РНР5 :
Foo::{$bar['baz']}()- PHP7 interpetation :
Foo::{$bar}['baz']()
Я делаю это довольно часто, на результатов, возвращаемых из запроса..
например
// $MyQueryResult is an array of results from a query foreach ($MyQueryResult as $key=>$value) { ${$key}=$value; }теперь я могу просто использовать $MyFieldname (что проще в операторах echo и т. д.), а не $MyQueryResult['MyFieldname']
Да, это, наверное, ленивая, но у меня никогда не было никаких проблем.
Tom если у вас есть существующий массив, вы можете преобразовать этот массив в объект и использовать его следующим образом:
$r = (object) $MyQueryResult; echo $r->key;
У меня есть решение для динамически создаваемого значения переменной и объединения всех значений в переменной.
if($_SERVER['REQUEST_METHOD']=='POST'){ $r=0; for($i=1; $i<=4; $i++){ $a = $_POST['a'.$i]; $r .= $a; } echo $r; }
Я был в положении, когда у меня было 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];
Comments