PHP: Prüfung auf Existenz einer Zelle in einem mehrdimensionalen Array

Lesezeit: 4 Minuten

shealtiels Benutzeravatar
shealtiel

Ich habe ein Array mit zahlreichen Dimensionen und möchte auf das Vorhandensein einer Zelle testen.

Der folgende kaskadierte Ansatz ist mit Sicherheit ein sicherer Weg, dies 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?

Darauf gehe ich näher ein:

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

Benutzeravatar von Marc B
Markus B

isset() ist die kanonische Testmethode, selbst für mehrdimensionale Arrays. Es sei denn, Sie müssen genau wissen, welche Dimension fehlt, dann so etwas wie

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

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

Allerdings, wenn Sie haben

$arr['a'] = null;

dann

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

Kommentarnachfolge:

Vielleicht hilft diese Analogie. Stellen Sie sich eine PHP-Variable (eine tatsächliche Variable, ein Array-Element usw.) als Karton vor:

  • isset() schaut in die Box und findet heraus, ob der Inhalt der Box in etwas typisiert werden kann, das “nicht null” ist. 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 des Kartons ist irrelevant, es wird nach Kartonspuren gesucht.

  • Vielen Dank. Wenn ja, warum sollte man überhaupt array_key_exists verwenden?

    – shealtiel

    2. Januar 2011 um 1:45 Uhr

  • @gidireich: genau deswegen. Zwischen einem vorhandenen und einem vorhandenen Schlüssel unterscheiden zu können null Wert und einen Schlüssel, der überhaupt nicht existiert. Was nur ein Grund ist, wenn es dir wichtig ist.

    – Jon

    2. Januar 2011 um 1:48 Uhr

  • mit isset Ihre Überprüfung, ob der Schlüssel und der Wert vorhanden oder nicht null sind, mit array_key_exists Ihre Überprüfung, ob die Schlüssel existiert unabhängig davon, ob die Werte ist null

    – Robert Pitt

    2. Januar 2011 um 1:56 Uhr

Benutzeravatar von user1327498
Benutzer1327498

Ich hatte das gleiche Problem, außer dass ich es für einige Drupal-Sachen brauchte. Ich musste auch überprüfen, ob Objekte sowohl Elemente als auch Arrays enthielten. Hier ist der Code, den ich erstellt habe, es ist eine rekursive Suche, die prüft, ob Objekte sowohl den Wert als auch 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;
}

Verwenden: Zum Beispiel

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

In meinem Fall in Drupal bedeutet dies für mich, dass die folgende Variable existiert

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

Beachten Sie, dass nur weil ‘#object’ als Objekt bezeichnet wird, dies nicht bedeutet, dass dies der Fall ist. Meine rekursive Suche würde auch wahr zurückgeben, wenn dieser Ort existierte

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

Benutzeravatar von Kwadz
Kwadz

Wenn Sie überprüfen möchten $arr['dim1Key']['dim2Key']['dim3Key']um sicherzugehen, müssen Sie vorher prüfen, ob alle Arrays vorhanden sind dim3Key. Dann können Sie verwenden array_key_exists.

Also ja, es gibt einen einfacheren Weg mit einer einzigen if Aussage wie die folgende:

if (isset($arr['dim1Key']['dim2Key']) &&
    array_key_exists('dim3Key', $arr['dim1Key']['dim2Key'])) ...

Ich ziehe es vor, eine Hilfsfunktion wie die folgende zu erstellen:

function my_isset_multi( $arr,$keys ){
    foreach( $keys as $key ){
        if( !isset( $arr[$key] ) ){
            return false;
        }
        $arr = $arr[$key];
    }
    return $arr;
}

Dann überprüfe ich in meinem Code zuerst das Array mit der obigen Funktion, und wenn es nicht falsch zurückgibt, wird es das Array selbst zurückgeben.

Stellen Sie sich vor, Sie haben diese Art von Array:

$arr = array( 'sample-1' => 'value-1','sample-2' => 'value-2','sample-3' => 'value-3' );

Du kannst so etwas schreiben:

$arr = my_isset_multi( $arr,array( 'sample-1','sample-2','sample-3' ) );

if( $arr ){
    //You can use the variable $arr without problems
}

Die Funktion my_isset_multi prüft auf jede Ebene des Arrays, und wenn ein Schlüssel nicht gesetzt ist, gibt sie false zurück.

Für einen schnellen Einzeiler können Sie verwenden hat Methode aus diese Array-Bibliothek:

Arr::has('dim1Key.dim2Key.dim3Key')

Ein großer Vorteil ist, dass Sie die Punktnotation verwenden können, um Array-Schlüssel anzugeben, was die Dinge einfacher und eleganter macht.

Außerdem funktioniert diese Methode wie erwartet für null Wert, weil es intern verwendet wird array_key_exists.

1412520cookie-checkPHP: Prüfung auf Existenz einer Zelle in einem mehrdimensionalen Array

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy