2011-10-07 11 views
25

mam następującą tablicę:Jak uniknąć PHP Zawiadomienie „Undefined offset: 0” bez sprawdzenia każdego pola tablicy

$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'] 
    ); 

może się zdarzyć, że niektóre pola nie są ustawione, to jest w porządku. w rzeczywistości otrzymuję ten anons PHP:

Wskazówka: niezdefiniowany offset: 0 w bafa_insert_keyvisual() ...........

jest to jakoś możliwe do przypisania domyślnego wartość do każdego klawisza w przypadku, gdy jest niezdefiniowana BEZ ręcznego sprawdzania każdego pola tablicy?

dzięki za pomoc

+0

nie jest problemem naprawdę z $ row-> field_field_video tablicy źródłowej, które przypisujemy ze zamiast tablicy $ keyvisual_data ? Czy zweryfikowałeś, że zdefiniowano $ row-> field_field_video [0]? –

+0

to są pola opcjonalne. czasami mają wartość, czasami nie. Sprawdzam to później w mojej funkcji, a następnie działam w zależności od tego, czy mają wartość, czy nie. – maze

Odpowiedz

13

Tak, dodaj @ przed polem typu:

$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'] 
); 

a następnie zainicjować wartości null:

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

etc ...

+0

dlaczego ta odpowiedź została odrzucona? faktycznie robi to, co chcę, przy najmniejszym wysiłku. czy jest jakiś problem z tą metodą? – maze

+4

@ Problem z robieniem tego polega na tym, że pomija błąd bez powodu ... – Neal

+0

, więc przedrostek coś z @ nie robi nic, ale zapobiec komunikatom o błędach? ... chyba w tym przypadku jest w porządku. ponieważ później w mojej funkcji sprawdzam, czy wartość jest obecna, a następnie odpowiednio postępuję. ale dobrze wiedzieć. – maze

43

No nie ma

Można zrobić isset():

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

Albo, jeśli wiesz, że jesteś tylko będzie sprawdzenie indeks 0:

$array = $array + array(null); 

Więc jeśli oryginalny $array[0] został rozbrojony, teraz t jest null

0

Można dodać skrótowej czek jeśli każda wartość jest pusta

$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... 
); 

Mniej niechlujny wersja tego, aby wyjaśnić kod jaśniej:

<?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']; 
?> 
-1

Szczerze mówiąc, struktura wiersza obiektu danych doesnt wydają się bardzo wygodnym i podatne na błędy. Zwłaszcza jeśli używasz $ wiersz w jakimś innym kontekście, zbyt, chciałbym zaproponować Ci owinąć go w obiekcie:

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(), 
    ... 
); 

Jeśli istnieje tylko jedna wartość e. sol. wewnątrz $row->field_field_video to nie powinna być tablica. Użyłbym klasy wrapper jako warstwy anty-korupcyjnej, gdyby ta dziwna struktura danych pochodziła z odległego źródła lub czegoś podobnego. W przeciwnym razie będzie pełzał po twojej aplikacji z obiektami $row->field_field_video[0]... w każdym miejscu.

Wiem, że nie jest to szybkie i łatwe rozwiązanie, które chcesz, ale połykanie błędów nigdy nie jest dobrym pomysłem.

0

Powinieneś użyć funkcji "isset", aby sprawdzić istnienie pola i zainicjować dobrą praktykę kodowania.

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

lub użyć go w ten sposób:

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