2010-12-20 20 views
5

Uno de mis colegas parecen tener un 'índice indefinido' error en un código que he escrito

Este código mío es el siguiente:

if (is_array ($arr['key'])) 

Mi intención era comprobar si $ matriz tiene una clave denominada 'llave', y si el valor de esa clave es propia matriz. ¿Debo hacerlo en su lugar: if(isset($arr['key']) && is_array ($arr['key']))?

Quizás lo siguiente sea equivalente: Supongamos que $ var no está configurado. Entonces, ¿is_array ($ var) causará un error o simplemente devolverá falso?

Gracias

Respuesta

6

Sí, utilice isset, entonces is_array.

if(isset($arr['key']) && is_array($arr['key'])) { 
    // ... 
} 

Dado que PHP utiliza la evaluación lógica de cortocircuito, se detendrá antes de que llegue a is_array(), por lo que no se consigue un error.

2

Probar:

is_array($arr) && array_key_exists('key', $arr) 
+0

Esto no responde a mi pregunta, pero no fue bastante claro. Editado, por favor, vuelva a mirar – shealtiel

+0

Si ** no ** está configurado, emitirá un Aviso. Lo que puede hacer es verificar primero 'isset ($ arr) && is_array ($ arr)'. – ncuesta

0

cheque si es que existe en primer lugar, a continuación, si es una matriz. De lo contrario, seguirá recibiendo el mismo error.

if (isset($arr['key'])) { 
    if (is_array ($arr['key']) { 

    } 
} 
+2

¿Por qué no ambos en la misma declaración: if (isset ($ arr ['key']) && is_array ($ arr ['key'])? – shealtiel

0

Tal vez se puede considerar una función get genérica() para recuperar datos a salvo de las matrices:

/* 
    Get with safety 
    @author: boctulus 

    @param array 
    @param index1 
    @param index2 
    .. 
*/ 
function get(){ 
    $numargs = func_num_args(); 
    $arg_list = func_get_args(); 

    $v = $arg_list[0]; 

    for ($i = 1; $i < $numargs; $i++) 
    { 
      if (isset($v[$arg_list[$i]])) 
      $v = $v[$arg_list[$i]]; 
     else 
      return null; 
    } 

    return $v; 
} 

Uso:

$arr = []; 

var_dump(get($arr,'a','b')); // NULL 

$arr['a']['b'] = 'ab'; 
var_dump(get($arr,'a','b')); // 'ab' 
Cuestiones relacionadas