Использование переменных переменных для заполнения массива приводит к ошибке

1

У меня есть следующий код:

function filterUsers(array $setOfAllUsers) {
   if (empty($setOfAllUsers)) {
      return array(array(), array());
   }

   $activeUsers   = array();
   $inactiveUsers = array();
   foreach($setOfAllUsers as $userRow) {
       $var = ($userRow['IsActive'] ? '' : 'in') . 'activeUsers';

       $$var[$userRow['CID']]['Label'] = $userRow['UserLabel'];
       // Error happens here ---^

       $$var[$userRow['CID']]['UserList'][$userRow['UID']] = array(
           'FirstName' => $userRow['FName'],
           'LastName'  => $userRow['LName'],
           ... More data
       );
   }

   return array($activeUsers, $inactiveUsers);
}

Я получаю следующую ошибку: Warning: Illegal string offset 'Label' in...

Как я могу это исправить? Сначала я попытался определить часть метки следующим образом: $$var[$userRow['CID']] = array(); $$var[$userRow['CID']]['Label'] = ''; $$var[$userRow['CID']] = array(); $$var[$userRow['CID']]['Label'] = ''; но не работает.

Чтобы яснее понять, чего я пытаюсь достичь, это:

if ($userRow['IsActive']) {
   $activeUsers[$userRow['CID']]['Label'] = $userRow['UserLabel'];

   $activeUsers[$userRow['CID']]['UserList'][$userRow['UID']] = array(
           'FirstName' => $userRow['FName'],
           'LastName'  => $userRow['LName'],
           ... More data
   );
} else {
   $inactiveUsers[$userRow['CID']]['Label'] = $userRow['UserLabel'];

   $inactiveUsers[$userRow['CID']]['UserList'][$userRow['UID']] = array(
           'FirstName' => $userRow['FName'],
           'LastName'  => $userRow['LName'],
           ... More data
   );
}

Вместо того, чтобы повторять выше в if/else, я хотел достичь этого, используя $$

  • 0
    Как вы создаете $setOfAllUsers и как выглядит этот массив. Пример только, пожалуйста.
  • 1
    В переменной цикла у вас есть двойной знак доллара $$var .
Показать ещё 7 комментариев
Теги:
variable-variables

4 ответа

3
Лучший ответ
function filterUsers(array $setOfAllUsers) {
   if (empty($setOfAllUsers)) {
      return array(array(), array());
   }

   $users = array(
     'inactiveUsers' => array(), 
     'activeUsers'   => array()
   );
   foreach($setOfAllUsers as $userRow) {
       $status = ($userRow['IsActive'] ? '' : 'in') . 'activeUsers';
       $users[$status][$userRow['CID']] = array();
       $users[$status][$userRow['CID']]['Label'] = $userRow['UserLabel'];

       $users[$status][$userRow['CID']]['UserList'] = array(
           $userRow['UID'] => array(
             'FirstName' => $userRow['FName'],
             'LastName'  => $userRow['LName'],
           )
       );
   }

   return $users;
}
  • 1
    Спасибо, это похоже на более чистую версию того, что я пытаюсь сделать, и никого не смущает :). Наверное, я забыл сделать вещи проще и не усложнять их.
4

Попробуйте использовать ${$var} вместо $$var.

РЕДАКТИРОВАТЬ

Из руководства PHP (http://php.net/manual/en/language.variables.variable.php):

Чтобы использовать переменные переменные с массивами, вы должны решить проблему двусмысленности. То есть, если вы пишете $$ a [1], тогда анализатор должен знать, хотите ли вы использовать $ a [1] в качестве переменной или если вы хотите $$ a как переменную, а затем индекс [1] из эта переменная. Синтаксис для устранения этой двусмысленности: $ {$ a [1]} для первого случая и $ {$ a} [1] для второго.

  • 0
    Это на самом деле работает
  • 0
    Конечно, я не понимаю, почему кто-то дает этот ответ «бесполезно».
0

Не используйте var-vars, как это. Вы столкнулись с синтаксическим синдромом PHP. И даже если бы не было синтаксического сбоя, вы не должны использовать var-vars в первую очередь. Они делают для кода, недоступного для отладки.

$x = 'foo';
$foo = array();
$$x[0] = 1;
var_dump($x);  // string(3) "foo"
var_dump($foo); // array(0) { }
$$x[1][2] = 3;
PHP Notice:  Uninitialized string offset: 2 in php shell code on line 1

Обратите внимание на то, как массив не был изменен с помощью присваивания $$x[0], и как определение размера 2+ вызывает "неопределенное смещение строки". Ваш var-var не рассматривается как массив - он рассматривается как STRING и не работает, потому что это синтаксический сбой. Вы можете рассматривать строки как массивы, но не используя var vars:

$bar = 'baz';
$bar[1] = 'q';
echo $bar; // output: bqz

Кажется, что нет способа использовать var-var как массив, особенно многомерный массив.

0

Попробуйте следующее:

$myUsers = $$var;
$myUsers[...][...] = ...;

Проблема с использованием $$var[...][...] заключается в том, что сначала $var[...][...] а затем пытается найти переменную с именем $ $var[...][...].

  • 0
    Я пытался это, он возвращает пустой, так как он не изменяет массивы $ activeUsers и $ inactiveUsers
  • 0
    Хотя это не отвечает на первоначальный вопрос с использованием $$ , но попробуйте это с использованием $myUsers = ($userRow['IsActive'] ? $activeUsers : $inactiveUsers); ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню