2011-01-02 15 views
19

Tengo una matriz con numerosas dimensiones, y quiero probar la existencia de una celda.PHP: probando la existencia de una celda en una matriz multidimensional

La aproximación por debajo de cascada, será sin duda un modo seguro de hacerlo:

if (array_key_exists($arr, 'dim1Key')) 
    if (array_key_exists($arr['dim1Key'], 'dim2Key')) 
    if (array_key_exists($arr['dim1Key']['dim2Key'], 'dim3Key')) 
     echo "cell exists"; 

Pero, ¿existe una manera más sencilla?

voy a entrar en más detalles sobre esto:

  1. ¿Puedo realizar esta comprobación en un solo estado de cuenta?
  2. ¿Tengo que usar array_key_exist o puedo usar algo como isset? ¿Cuándo uso cada uno y por qué?

Respuesta

62

isset() es el método canónico de prueba, incluso para matrices multidimensionales. A menos que usted necesita saber exactamente qué dimensión se encuentra, entonces algo así como

isset($arr[1][2][3]) 

es perfectamente aceptable, aunque los [1] y [2] elementos no están allí (3 no puede existir a menos de 1 y 2 son allí).

Sin embargo, si usted tiene

$arr['a'] = null; 

continuación

isset($arr['a']); // false 
array_key_exists('a', $arr); // true 

comentario seguimiento:

Quizás esta analogía ayudará. Pensar en una variable de PHP (una variable real, un elemento de matriz, etc ...) como una caja de cartón:

  • isset() se ve el interior de la caja y se da cuenta de si el contenido de la caja puede ser encasillado a algo que es "no nulo". No importa si la caja existe o no, solo se preocupa por el contenido de la caja. Si el cuadro no existe, obviamente no puede contener nada.
  • array_key_exists() comprueba si la caja existe o no. El contenido de la caja es irrelevante, está buscando rastros de cartón.
+0

Gracias. Si es así, ¿por qué uno debería usar array_key_exists? – shealtiel

+4

@gidireich: exactamente por esa razón. Para poder diferenciar entre una clave existente y tener un valor 'nulo', y una clave que no existe en absoluto. Lo cual es solo una razón si te preocupas por eso. – Jon

+0

con 'isset' su comprobación si la clave y el valor existe o no es nulo, con 'array_key_exists' su comprobación si ** key ** existe independientemente de si los valores son' null' – RobertPitt

5

Estaba teniendo el mismo problema, excepto que lo necesitaba para algunas cosas de Drupal. También necesitaba verificar si los objetos contenían elementos o matrices. Aquí está el código que hice, es una búsqueda recursiva que busca ver si los objetos contienen tanto el valor como las matrices. Pensé que alguien podría encontrarlo útil.

function recursiveIsset($variable, $checkArray, $i=0) { 
    $new_var = null; 
    if(is_array($variable) && array_key_exists($checkArray[$i], $variable)) 
     $new_var = $variable[$checkArray[$i]]; 
    else if(is_object($variable) && array_key_exists($checkArray[$i], $variable)) 
     $new_var = $variable->$checkArray[$i]; 
    if(!isset($new_var)) 
     return false; 

    else if(count($checkArray) > $i + 1) 
     return recursiveIsset($new_var, $checkArray, $i+1); 
    else 
     return $new_var; 
} 

Uso: Por ejemplo

recursiveIsset($variables, array('content', 'body', '#object', 'body', 'und')) 

En mi caso en esta Drupal ción para mí que la siguiente variable existía

$variables['content']['body']['#object']->body['und'] 

debida nota de que sólo porque '#object' se llama objeto no quiere decir que lo es.Mi búsqueda recursiva también sería verdadera si esta ubicación existiera

$variables->content->body['#object']->body['und'] 
Cuestiones relacionadas