非法偏移类型错误

时间:2014-06-30 14:43:44

标签: php drupal drupal-7

所以我有以下功能:

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

2 个答案:

答案 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]);
      }
    }
  }

}