У меня есть следующий массив:
$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]...
вещей повсюду.
Я знаю, что это не быстрое и простое решение, которое вы хотите, но проглатывание ошибок никогда не является хорошей идеей.