2011-01-02 15 views
19

Ich habe ein Array mit zahlreichen Dimensionen, und ich möchte für die Existenz einer Zelle testen.PHP: Testen der Existenz einer Zelle in einem multidimensionalen Array

Der Ansatz unten kaskadiert werden, wird sicher eine sichere Art und Weise sein, es zu tun:

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

Aber gibt es einen einfacheren Weg?

Ich werde in mehr Einzelheiten gehen:

  1. Kann ich diese Prüfung in einer einzigen Anweisung ausführen?
  2. Muss ich array_key_exist verwenden oder kann ich etwas wie isset verwenden? Wann verwende ich jedes und warum?

Antwort

62

isset() ist die cannonical Methode der Prüfung auch für mehrdimensionalen Arrays. Sofern Sie nicht genau wissen müssen, welche Dimension fehlt, wird dann so etwas wie

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

ist durchaus akzeptabel, auch wenn die [1] und [2] Elemente sind nicht da (3 kann nicht existieren, es sei denn, 1 und 2) sind.

Wenn Sie jedoch

$arr['a'] = null; 

dann

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

Kommentar Followup haben:

Vielleicht wird diese Analogie helfen. Denken Sie an eine PHP-Variable (eine tatsächliche Variable, ein Array-Element, etc ...) als Karton:

  • isset() in der Box sieht und findet heraus, ob der Inhalt der Box kann auf etwas typisieren werden, die „nicht Null". Es ist egal, ob die Box existiert oder nicht - es interessiert nur der Inhalt der Box. Wenn die Box nicht existiert, kann sie offensichtlich nichts enthalten.
  • array_key_exists() überprüft, ob die Box selbst existiert oder nicht. Der Inhalt der Schachtel ist irrelevant, es wird nach Pappspuren gesucht.
+0

Danke. Wenn ja, warum sollte man jemals array_key_exists verwenden? – shealtiel

+4

@gidireich: genau aus diesem Grund. Um zwischen einem vorhandenen Schlüssel und einem Nullwert und einem Schlüssel, der überhaupt nicht existiert, unterscheiden zu können. Was ist nur ein Grund, wenn Sie sich darum kümmern. – Jon

+0

Mit 'isset' prüfen Sie, ob der Schlüssel und der Wert existiert oder nicht null ist. Mit' array_key_exists' überprüfen Sie, ob der ** Schlüssel ** existiert, unabhängig davon, ob die Werte 'null' sind – RobertPitt

5

Ich hatte das gleiche Problem, außer dass ich es für einige Drupal-Sachen brauchte. Ich musste auch prüfen, ob Objekte Objekte und Arrays enthielten. Hier ist der Code, den ich gemacht habe, es ist eine rekursive Suche, die sieht, ob Objekte den Wert sowie Arrays enthalten. Dachte, jemand könnte es nützlich finden.

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; 
} 

Verwendung: Zum Beispiel

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

In meinem Fall in Drupal für mich ment, dass die folgende Variable

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

zur Kenntnis gegeben, dass nur weil '#object' Objekt heißt nicht, dass es ist.Meine rekursive Suche würde auch true zurückgeben, wenn dieser Ort existiert

Verwandte Themen