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

Using variable variables to populate array results in error

提问人:GGio 提问时间:8/14/2015 最后编辑:GGio 更新时间:8/14/2015 访问量:163

问:

我有以下代码:

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'] = '';

为了弄清楚我试图实现的目标,是这样的:

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 我想使用$$

php 变量

评论

0赞 RiggsFolly 8/14/2015
你是如何创建的,这个数组是什么样子的。请仅举例说明。$setOfAllUsers
1赞 marian0 8/14/2015
循环变量中有双美元符号。$$var
0赞 GGio 8/14/2015
@RiggsFolly它是一个函数,所以它被传入,在某些情况下它是从数据库中检索的,在某些情况下它是动态构建的
0赞 Kristiyan 8/14/2015
此错误通常发生在没有数组时。在本例中,它是 .请与var_dump核对$setOfAllUsers
0赞 GGio 8/14/2015
@marian0这是故意的,因为我想访问“变量的变量”

答:

4赞 arbogastes 8/14/2015 #1

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

编辑

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

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

评论

0赞 arbogastes 8/14/2015
当然,我不明白为什么有人给出这个答案“没用”。
0赞 John Bupit 8/14/2015 #2

请尝试以下操作:

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

使用的问题在于,首先要计算,然后尝试查找名为 $ 的变量。$$var[...][...]$var[...][...]$var[...][...]

评论

0赞 GGio 8/14/2015
我试过了,它返回空,因为它不修改 $activeUsers 和 $inactiveUsers 数组
0赞 John Bupit 8/14/2015
虽然这不能回答原来的问题,但请尝试使用 .$$$myUsers = ($userRow['IsActive'] ? $activeUsers : $inactiveUsers);
3赞 Mihai Matei 8/14/2015 #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赞 GGio 8/14/2015
谢谢,这似乎是我正在尝试做的事情的更简洁的版本,不会让任何人:)感到困惑。我想我忘了让事情变得更简单,而不是让它过于复杂。
0赞 Marc B 8/14/2015 #4

不要像这样使用 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

请注意数组如何未被赋值修改,以及 2+ 维同化如何导致“未定义的字符串偏移”。你的 var-var 没有被当作一个数组 - 它被当作一个字符串,并且失败了,因为它是一个语法错误。您可以将字符串视为数组,但不能使用 var vars:$$x[0]

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

似乎没有办法将 var-var 用作数组,尤其是多维数组。