Подтвердить что ты не робот

Как избежать уведомления 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 БЕЗ проверки каждого поля массива вручную?

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

4b9b3361

Ответ 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]... повсюду.

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