使用变量填充数组会导致错误

时间:2015-08-14 14:22:23

标签: php variable-variables

我有以下代码:

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 ...

我该如何解决这个问题?我首先尝试像这样定义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中重复上述内容,而是使用$$

来实现它

4 个答案:

答案 0 :(得分:4)

尝试使用${$var}代替$$var

修改

来自PHP手册(http://php.net/manual/en/language.variables.variable.php):

  

为了将变量变量与数组一起使用,您必须解析一个   歧义问题。也就是说,如果你编写$$ a [1],则解析器需要   要知道你是否打算使用$ a [1]作为变量,或者你想要使用$$ a   作为变量,然后是该变量的[1]索引。语法   解决这种歧义的原因是:第一个案例的$ {$ a [1]}和   $ {$ a} [1]为第二个。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

尝试以下方法:

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

使用$$var[...][...]的问题是,首先评估$var[...][...],然后尝试查找名为$ $var[...][...]的变量。

答案 3 :(得分: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用作数组,尤其是多维数组。