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