2011-10-07 46 views
25

i tener la siguiente matriz:¿Cómo evitar el Aviso PHP "Undefined offset: 0" sin comprobar cada campo de la matriz

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

puede ocurrir que algunos de los campos no está ajustada, esto está bien. de hecho, estoy recibiendo este aviso PHP:

Notice: Undefined offset: 0 en bafa_insert_keyvisual() ...........

es de algún modo posible asignar un valor predeterminado valor para cada tecla en caso de que no esté definida SIN verificar cada campo de la matriz manualmente?

gracias por la ayuda

+0

no es el problema realmente con el $ de fila> field_field_video matriz de origen que se está asignando a partir, en lugar de la matriz $ keyvisual_data ? ¿Has verificado que $ row-> field_field_video [0] está definido? –

+0

esos son campos opcionales. a veces tienen un valor, a veces no. Estoy revisando esto más tarde en mi función y luego actúo dependiendo de si tienen un valor o no. – maze

Respuesta

13

Sí, añadir @ antes de que el campo como:

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

y luego inicializar los valores nulos:

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

etc ...

+0

¿por qué esta respuesta ha sido rechazada? en realidad hace lo que quiero con el mínimo esfuerzo. o hay algo problemático con este método de hacerlo? – maze

+4

@maze el problema al hacerlo así es que suprime el error sin ningún motivo ... – Neal

+0

así que prefijar algo con un @ no hace más que evitar mensajes de error? ... supongo que en este caso está bien. porque más tarde en mi función verifico si hay un valor presente y luego actúo en consecuencia. pero es bueno saberlo – maze

43

No, no hay

Usted puede hacer una isset():

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

O si sabe que sólo se le va a hacer el registro de índice 0:

$array = $array + array(null); 

Si el original $array[0] no se configuró, ahora t es null

0

Se podría añadir una comprobación abreviada si cada valor es nulo

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

Una versión menos sucio de este, para explicar el código con mayor claridad:

<?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

Para ser sinceros, la estructura de la fila objeto de datos no se parece muy conveniente y propenso a errores. Especialmente si está utilizando $ fila en algún otro contexto, también, sugeriría que lo envuelve en un objeto:

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

Si sólo hay un valor de e. gramo. dentro de $row->field_field_video entonces no debería ser una matriz. Usaría una clase contenedora como una especie de capa anticorrupción si esa extraña estructura de datos proviene de una fuente remota o similar. De lo contrario, se arrastrará a través de su aplicación con $row->field_field_video[0]... cosas por todo el lugar.

Sé que esta no es la solución rápida y fácil que desea, pero no es una buena idea tragar los errores.

0

Debe usar la función "isset" para verificar la existencia del campo, y de hecho es una buena práctica de codificación.

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

o puede utilizar de esta manera:

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