所以我有以下功能:
function sitesync_empty_vals(&$entity) {
$vals = false;
$entity = (array) $entity;
foreach ($entity as $field) {
if (is_array($field)) {
foreach ($field as $lang) {
foreach ($lang as $item) {
if (isset($item['value'])) {
if (empty($item['value'])) {
unset($field[$lang][$item]);
break;
}
else {
$vals = true;
}
}
}
}
if (!$vals && is_array($lang)) {
watchdog("field", print_r($field, true));
unset($field[$lang]);
}
}
}
}
我不断收到错误Illegal offset type
。
我不太明白为什么我会收到此错误 - 这似乎与取消设置$field[$lang][$item]
有关(我在发表评论时不会收到错误) ),但为什么会这样?是因为它在未设置后尝试迭代该项目吗?在该特定值为空的情况下,我想取消整个$ item的设置 - 这是用于两个不同服务器之间的数据规范化,其中一个服务器不存储任何数据,其中一个将数据存储为0
答案 0 :(得分:1)
foreach ($lang as $item) {
^^^^---array
unset($field[$lang][$item]);
^^^^^---using Array as array key
你可能想要更像的东西:
foreach($lang as $lang_key => $item) {
unset($field[$lang_key]....);
代替。正如下面的评论所指出的那样,$item
也是一个数组,因此您也希望对此进行类似的处理。
答案 1 :(得分:0)
以下是PHP文档的引用:
数组和对象不能用作键。这样做会导致警告:非法偏移类型。
http://www.php.net/manual/en/language.types.array.php
你必须使用密钥,而不是数组本身:
function sitesync_empty_vals(&$entity) {
$vals = false;
$entity = (array) $entity;
foreach ($entity as $field) {
if (is_array($field)) {
foreach ($field as $langKey=>$lang) {
foreach ($lang as $itemKey=>$item) {
if (isset($item['value'])) {
if (empty($item['value'])) {
unset($field[$langKey][$itemKey]);
break;
}
else {
$vals = true;
}
}
}
}
if (!$vals && is_array($lang)) {
watchdog("field", print_r($field, true));
unset($field[$langKey]);
}
}
}
}