Использование фигурных скобок с именами динамических переменных в PHP



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



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

var_dump($file0);


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

707   7  

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']()

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

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

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

например

// $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

    Ничего не найдено.