Ошибка недопустимого типа смещения

#php #drupal #drupal-7

#php #drupal #drupal-7

Вопрос:

Итак, у меня есть следующая функция:

 function sitesync_empty_vals(amp;$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 amp;amp; is_array($lang)) {
        watchdog("field", print_r($field, true));
        unset($field[$lang]);
      }
    }
  }
}
  

Я продолжаю получать ошибку Illegal offset type .

Я не совсем понимаю, почему я получаю эту ошибку — похоже, это связано с сбросом $field[$lang][$item] (я не получаю ошибку, когда я ее комментирую), но почему это должно быть? Это потому, что он пытается выполнить итерацию по этому элементу после его отмены? В случае, если это конкретное значение пустое, я хочу отменить весь $item — это для нормализации данных между двумя разными серверами, один из которых не хранит никаких данных, а один из которых хранит данные как 0.

Комментарии:

1. Это для Drupal, не так ли? Вы должны добавить тег Drupal и обновить описание, указав, какую версию Drupal вы используете.

Ответ №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. То же самое относится к $item — using $item['value'] ясно показывает, что это также массив.

2. Однако ваш ответ, вероятно, должен включать в себя, как исправить 😉

Ответ №2:

Вот цитата из документации PHP:

Массивы и объекты не могут использоваться в качестве ключей. Это приведет к появлению предупреждения: недопустимый тип смещения.

http://www.php.net/manual/en/language.types.array.php

Вы должны использовать ключи, а не сами массивы:

 function sitesync_empty_vals(amp;$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 amp;amp; is_array($lang)) {
    watchdog("field", print_r($field, true));
    unset($field[$langKey]);
      }
    }
  }
  

}