Verificarea cheii existente în matrice multidimensională

Spuneți că am o structură de date de genul acesta:

array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } } 

În cazul în care „mesaj” și „acțiune” sunt ambele opționale. Pentru a verifica dacă „prezintă prima mea încercare ar fi să scriu ceva de genul acesta:

if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ } 

Există o implementare mai curată?

Comentarii

Răspuns

Nu, aceasta este doar modul de a face acest lucru.

Chiar și atunci când nu sunt limitat la un anumit limbaj de script, nu mă pot gândi la o soluție mai curată?

Răspuns

Puteți face acest lucru!

if (isset($array["message"]["action"])) { /*...*/ } 

Dovadă:

<?php error_reporting(E_ALL); ini_set("error_reporting", E_ALL); ini_set("display_errors", 1); $array = [ "id" => 1, "name" => "foo", "message" => [ "action" => "PUT", ], ]; var_dump(isset($array["message"]["action"])); // true $array = [ "id" => 1, "name" => "foo" ]; var_dump(isset($array["message"]["action"])); // false 

Fără intrări de jurnal.

Rețineți că dacă valoarea dvs. este null, atunci și setul va reveni fals. Probabil că nu ar trebui să creați valori cu null.

Comentarii

  • Acestui răspuns îi lipsește și un ) și poate provoca generarea unei intrări de jurnal din cauza nerecuperării isset($array['message']) înainte de a-l dereferenția.
  • @Brythan nu, nu provoacă o intrare în jurnal. Dar da, lipsește un ).
  • Ne pare rău, am vrut să subliniez că ' trebuie să crank raportarea erorilor. Provoacă absolut o intrare în jurnal dacă aveți setat raportarea erorilor pentru aceasta. ' am primit anterior spam-ul jurnalelor mele. Aceasta a fost înregistrarea implicită la un moment dat. Este posibil să nu fie implicit acum (sau este posibil ca gazda dvs. să fi redus raportarea erorilor), dar sunt absolut sigur că situația respectivă poate genera o intrare de jurnal în anumite configurații.
  • Nu, chiar nu ' t L-am testat cu toate raportările de erori activate!

Răspuns

Nu este mai clar, dar probabil cea mai rapidă soluție:

if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ } 

A doua verificare este necesară deoarece unele valori evaluate cu isset() va rezulta fals, deși indexul există.

Răspuns

Eu „folosesc acest lucru într-un proiect al meu, dar eu” m folosind null ca stare dezactivată. (php 5.6)

<?php function &option_select($options, $default, ...$path) { if(!isset($path[0])) { return $options; } $cursor = &$options; foreach($path as $key) { if(isset($cursor[$key])) { $cursor = &$cursor[$key]; } else { return $default; } } return $cursor; } 

Este „o funcție care va căuta un path într-un copac.

echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C"); 

După cum puteți vedea. Mă buclez peste valorile dintr-o matrice: path. La început, setez un cursor ca referință la o matrice pe care trebuie să o caut. De fiecare dată când găsesc o tastă new, setez referința cursorului la cheia curentă pe care o caut. Dacă aveți xdebug și o interfață grafică bună, o puteți rescrie în algoritmul dorit. Este isset($cursor[$key]) trebuie să te schimbi. Sau injectați-l ca o funcție: f($cursor, $key, $default) => (bool)

Comentarii

  • Ați furnizat o soluție alternativă, dar ați nu a revizuit codul. Vă rugăm să adăugați explicații despre motivul pentru care aceasta ar fi o soluție mai bună pentru OP, mai degrabă decât ceea ce au deja.
  • Deoarece nu este ' t SirPython puternic tastat. În acest fel îl pot testa cu teste unitare, fără a efectua un test unitar pentru fiecare ' hardcoded-string '. Așa trebuie și cu testabilitatea și viteza pe care o pot crea cod de lucru.

Răspuns

Am căutat un similar soluție eu și am venit cu asta. Funcționează pentru a determina dacă cheia este setată deloc – și va reveni ADEVĂRAT chiar dacă valoarea cheii „acțiune” este NULĂ.

if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ } 

Dacă $array["message"] nu are chei, isset va returna FALSE oprind instrucțiunea IF. Dacă $array["message"] are chei – chiar și cele cu valori NULL – isset va reveni la TRUE, permițându-vă să verificați în siguranță dacă "action" cheia matricei există în $array["message"].

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *