Intereting Posts
PHP sort weekday и month-year array по индивидуальному заказу Только переменные должны передаваться по ссылке … в строке 13 Fail WordPress: Комментарии: Отправка комментария открывает связанный пост Скобки, изменяющие семантику результата вызова функции PHP и MySQL удаляют проблему с несколькими скриптами строк Передача $ _FILES или $ _POST на новую страницу с PHP Regex: добавить пробел, если буква смежна с номером Сессия уничтожается при обновлении страницы в PHP Невозможно вставить путь для нескольких изображений в таблице базы данных с помощью codeigniter Zend framework 2 рекомендуется для обработки ошибок «Недопустимое определение службы» при использовании DI-> Get Phalcon PHP использование разрывов строк в метатегах PHP-запись в csv из массива PHP DateTime :: createFromFormat AM PM Issue Пользовательское сообщение о заполненном статусе уведомления о статусе заказа только для роли пользователя

Как избежать уведомления PHP «Неопределенное смещение: 0» без проверки каждого поля массива

У меня есть следующий массив:

$keyvisual_data = array( 'video_file' => $row->field_field_video[0]['rendered']['#item']['uri'], 'bild_file' => $row->field_field_bild[0]['rendered']['#item']['uri'], 'subline_src' => $row->_field_data['nid']['entity']->field_key_titel['und'][0]['safe_value'], 'screenreader_src' => $row->field_field_alt_screenreader[0]['rendered']['#markup'], 'alt_src' => $row->field_field_bild[0]['rendered']['#item']['alt'] ); 

может случиться, что некоторые из полей не установлены, это нормально. на самом деле я получаю это сообщение PHP:

Примечание: Неопределенное смещение: 0 в bafa_insert_keyvisual () ………..

возможно ли каким-либо образом присвоить значение по умолчанию каждому ключу, если оно не определено БЕЗ проверки каждого поля массива вручную?

Спасибо за помощь

Да, добавьте @ перед полем:

 $keyvisual_data = array( 'video_file' => @$row->field_field_video[0]['rendered']['#item']['uri'], 'bild_file' => @$row->field_field_bild[0]['rendered']['#item']['uri'], 'subline_src' => @$row->_field_data['nid']['entity']->field_key_titel['und'][0]['safe_value'], 'screenreader_src' => @$row->field_field_alt_screenreader[0]['rendered']['#markup'], 'alt_src' => @$row->field_field_bild[0]['rendered']['#item']['alt'] ); 

и затем инициализировать нули:

 if($keyvisual_data['video_file'] === null) $keyvisual_data['video_file'] = $default_video_file; 

и т.д…

Нет, нет

Вы можете сделать isset() :

 if(isset($array[0])){ echo $array[0]; } else { //some error? } 

Или, если вы знаете, что вы будете только проверять индекс 0:

 $array = $array + array(null); 

Так что если исходный $array[0] был отменен, теперь он равен null

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

 $default_value = "Default value"; $keyvisual_data = array( 'video_file' => ($row->field_field_video[0]['rendered']['#item']['uri'] == null) ? $default_value : $row->field_field_video[0]['rendered']['#item']['uri'] // etc.. etc... ); 

Менее грязная версия этого, чтобы объяснить код более четко:

 <?php $default_value = "I am a Default value"; $video_file = null; $new_array = array( 'video_file' => ($video_file == null) ? $default_value : $video_file ); // Will output "I am a Default value" echo $new_array['video_file']; ?> 

Вы должны использовать функцию «isset», чтобы проверить существование поля и наполнить его хорошей практикой кодирования.

 $keyvisual_data = array( 'video_file' => isset($rowWrapper->getVideoFile()) ? $rowWrapper->getVideoFile() : "any default value", ... ); 

или вы можете использовать его таким образом:

 if(isset($rowWrapper->getVideoFile())) { $row['video_file'] = $rowWrapper->getVideoFile(); } else { $row['video_file'] = ""; } 

Честно говоря, структура объекта данных строки не кажется очень удобной и подверженной ошибкам. Особенно, если вы используете $ row в другом контексте, я бы предложил вам обернуть его в объект:

 class RowWrapper { private $_row; public function __construct($row) { $this->_row = $row; } public function getVideoFile() { if (!isset($row->field_field_video[0])) { return null; } return $row->field_field_video[0]['rendered']['#item']['uri']; } ... } $rowWrapper = new RowWrapper($row); $keyvisual_data = array( 'video_file' => $rowWrapper->getVideoFile(), ... ); 

Если у вас есть только одно значение, например, внутри $row->field_field_video то оно не должно быть массивом. Я бы использовал класс-оболочку как своего рода слой с анти-коррупцией, если эта странная структура данных исходит из удаленного источника или тому подобного. В противном случае он будет проползать через ваше приложение с помощью $row->field_field_video[0]... вещей повсюду.

Я знаю, что это не быстрое и простое решение, которое вы хотите, но проглатывание ошибок никогда не является хорошей идеей.