У меня есть следующий код:
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, я хотел достичь этого, используя $$
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}
вместо $$var
.
РЕДАКТИРОВАТЬ
Из руководства PHP (http://php.net/manual/en/language.variables.variable.php):
Чтобы использовать переменные переменные с массивами, вы должны решить проблему двусмысленности. То есть, если вы пишете $$ a [1], тогда анализатор должен знать, хотите ли вы использовать $ a [1] в качестве переменной или если вы хотите $$ a как переменную, а затем индекс [1] из эта переменная. Синтаксис для устранения этой двусмысленности: $ {$ a [1]} для первого случая и $ {$ a} [1] для второго.
Не используйте 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 как массив, особенно многомерный массив.
Попробуйте следующее:
$myUsers = $$var;
$myUsers[...][...] = ...;
Проблема с использованием $$var[...][...]
заключается в том, что сначала $var[...][...]
а затем пытается найти переменную с именем $ $var[...][...]
.
$$
, но попробуйте это с использованием $myUsers = ($userRow['IsActive'] ? $activeUsers : $inactiveUsers);
,
$setOfAllUsers
и как выглядит этот массив. Пример только, пожалуйста.$$var
.