синтаксис массива php $ { сбивает меня с толку

#php #html #arrays

#php #HTML #массивы

Вопрос:

Я создаю массив $values, а затем извлекаю элементы в локальную область.

  $values['status'.$i] = $newStatus[$i];
 extract($values);
 

Когда я визуализирую HTML-страницу. Я использую следующее

  <?php if(${'status'.$i} == 'OUT'){ ?>
 

но я смущен тем, что делает $ { и почему $status .$я не разрешу

Комментарии:

1. Это «переменная переменная»

Ответ №1:

$status.$i означает

возьмите значение $status переменной и объедините его со значением $i переменной.

${'status'.$i} означает

примите значение $i переменной, добавьте идентификатор в 'status' строку и примите значение переменной 'status'.$i

Пример:

С $i равными '2' и $status равными 'someStatus' :

  • $status.$i вычисляется до 'someStatus' . '2' , что 'someStatus2'
  • ${'status'.$i} вычисляется, к ${'status'.'2'} которому относится $status2 . И если $status2 определена переменная — вы получите некоторое значение.

Ответ №2:

Я хотел добавить к принятому ответу предложенный альтернативный способ достижения вашей цели.

Повторное повторение принятого ответа…

Давайте предположим следующее,

 $status1 = 'A status';
$status = 'foo';
$i = 1;
$var_name = 'status1';
 

и затем,

 echo $status1; // A status
echo $status.$i; // foo1
echo ${'status'.$i}; // A status
echo ${"status$i"}; // A status
echo ${$var_name}; // A status
 

Сначала разрешается строка внутри фигурных скобок, что фактически приводит к ${'status1'} тому, что она такая же, как $status1 . Это переменная переменная.

Читайте о переменных переменных — http://php.net/manual/en/language.variables.variable.php

Альтернативное решение

Многомерные массивы, вероятно, являются более простым способом управления вашими данными.

Например, вместо чего-то вроде

 $values['status'.$i] = $newStatus[$i];
 

как насчет

 $values['status'][$i] = $newStatus[$i];
 

Теперь мы можем использовать такие данные, как,

 extract($values);

if($status[$i] == 'OUT'){ 
   // do stuff
}
 

Альтернативное решение ПЛЮС

Возможно, вы даже обнаружите, что можете подготовить свой массив состояния по-другому. Я предполагаю, что вы используете какой-то цикл? Если это так, то оба они эквивалентны,

 for ($i=0; $i<count($newStatus); $i  ){
    $values['status'][$i] = $newStatus[$i];
}
 

и,

 $values['status'] = $newStatus;
 

🙂