使用可变变量填充数组导致错误
Using variable variables to populate array results in error
我有以下代码:
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 中重复上面的内容,而是想使用 $$
来实现它
尝试使用 ${$var}
而不是 $$var
。
编辑
来自PHP手册(http://php.net/manual/en/language.variables.variable.php):
In order to use variable variables with arrays, you have to resolve an
ambiguity problem. That is, if you write $$a[1] then the parser needs
to know if you meant to use $a[1] as a variable, or if you wanted $$a
as the variable and then the [1] index from that variable. The syntax
for resolving this ambiguity is: ${$a[1]} for the first case and
${$a}[1] for the second.
尝试以下操作:
$myUsers = $$var;
$myUsers[...][...] = ...;
使用 $$var[...][...]
的问题是首先计算 $var[...][...]
,然后它试图找到名为 $$var[...][...]
.
的变量
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;
}
不要像这样使用 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+ 维赋值如何导致 "undefined string offset"。您的 var-var 没有被视为一个数组 - 它被视为一个字符串,并且失败了,因为它是一个语法故障。您可以将字符串视为数组,但不能使用 var vars:
$bar = 'baz';
$bar[1] = 'q';
echo $bar; // output: bqz
似乎没有办法将 var-var 用作数组,尤其是多维数组。
我有以下代码:
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 中重复上面的内容,而是想使用 $$
尝试使用 ${$var}
而不是 $$var
。
编辑
来自PHP手册(http://php.net/manual/en/language.variables.variable.php):
In order to use variable variables with arrays, you have to resolve an ambiguity problem. That is, if you write $$a[1] then the parser needs to know if you meant to use $a[1] as a variable, or if you wanted $$a as the variable and then the [1] index from that variable. The syntax for resolving this ambiguity is: ${$a[1]} for the first case and ${$a}[1] for the second.
尝试以下操作:
$myUsers = $$var;
$myUsers[...][...] = ...;
使用 $$var[...][...]
的问题是首先计算 $var[...][...]
,然后它试图找到名为 $$var[...][...]
.
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;
}
不要像这样使用 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+ 维赋值如何导致 "undefined string offset"。您的 var-var 没有被视为一个数组 - 它被视为一个字符串,并且失败了,因为它是一个语法故障。您可以将字符串视为数组,但不能使用 var vars:
$bar = 'baz';
$bar[1] = 'q';
echo $bar; // output: bqz
似乎没有办法将 var-var 用作数组,尤其是多维数组。