Как избежать уведомления PHP "Undefined offset: 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:
Примечание: смещение Undefined: 0 в bafa_insert_keyvisual()...........
можно ли каким-либо образом присвоить значение по умолчанию каждому ключу, если оно Undefined БЕЗ проверки каждого поля массива вручную?
спасибо за помощь
Ответы
Ответ 1
Да, добавьте @
перед полем:
$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;
и т.д...
Ответ 2
Нет, нет
Вы можете сделать isset()
:
if(isset($array[0])){
echo $array[0];
}
else {
//some error?
}
Или, если вы знаете, что вы будете только проверять индекс 0:
$array = $array + array(null);
Итак, если исходный $array[0]
не был установлен, теперь он null
Ответ 3
Вы можете добавить сокращенную проверку, если каждое значение равно 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'];
?>
Ответ 4
Вы должны использовать функцию "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'] = "";
}
Ответ 5
Честно говоря, структура объекта данных строки не кажется очень удобной и подверженной ошибкам. Особенно, если вы используете $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(),
...
);
Если у вас есть только одно значение e. г. внутри $row->field_field_video
, тогда он не должен быть массивом. Я бы использовал класс-оболочку как своего рода слой с анти-коррупцией, если эта странная структура данных исходит из удаленного источника или тому подобного. В противном случае он будет ползать через ваше приложение с текстом $row->field_field_video[0]...
повсюду.
Я знаю, что это не быстрое и простое решение, которое вы хотите, но проглатывание ошибок никогда не является хорошей идеей.