2010-10-27 9 views
11

Esiste una funzione là fuori per assicurarsi che ogni matrice data sia conforme a una particolare struttura? Quello che voglio dire è che ha nomi di chiavi particolari, forse tipi particolari per valori e qualsiasi struttura annidata.Come posso convalidare la struttura dei miei array PHP?

In questo momento ho un posto in cui voglio essere sicuro che la matrice che passa abbia determinate chiavi, una coppia che tiene un determinato tipo di dati e una sotto-matrice con particolari nomi di chiavi. Ho fatto un sacco di run-in giro perché ero di passaggio array malformati ad esso, e, infine, io sono al punto in cui ho un mucchio di

if (! isset($arr['key1'])) { .... } 
if (! isset($arr['key2'])) { .... } 
if (! isset($arr['key3'])) { .... } 

avrei risparmiato un sacco di tempo e costernazione se avessi potuto verificare che l'array fosse conforme a una particolare struttura in anticipo. Idealmente qualcosa come

$arrModel = array(
    'key1' => NULL , 
    'key2' => int , 
    'key3' => array(
     'key1' => NULL , 
     'key2' => NULL , 
    ), 
); 

if (! validate_array($arrModel, $arrCandidate)) { ... } 

Quindi, la domanda che mi sto chiedendo è, fa questo già esiste, o devo scrivere questo me stesso?

risposta

6

Non esiste costruito nel

Forse provare qualcosa di simile (non testata):

array_diff(array_merge_recursive($arrCandidate, $arrModel), $arrModel) 
+2

Credo che tu intenda array_merge_recursive –

+0

Sì, grazie. (Aggiornato) –

0

Creare un array che definisce la struttura, quindi passare attraverso un loop dell'array che si desidera controllare e confrontarlo con la struttura dell'array definita.

1

So che questo è una sorta di un vecchio post, mi dispiace se la mia risposta è no approppriate.

Sono in procinto di scrivere un pacchetto php che fa esattamente quello che stai chiedendo, si chiama Structure.

Che cosa si può fare con il pacchetto è qualcosa come:

$arrayCheck = new \Structure\ArrayS(); 
$arrayCheck->setFormat(array("profile"=>"array")); 
if ($arrayCheck->check($myArray)) { 
    //... 
} 

È possibile verificarlo qui: http://github.com/3nr1c/structure

1

mi sono imbattuto in uno strumento chiamato Matchmaker su GitHub, che sembra molto completo e ha supporto compositore e unit test:
https://github.com/ptrofimov/matchmaker

è possibile includere nel vostro progetto con composer require ptrofimov/matchmaker.

+0

Per elettori discendenti casuali: perché? Per favore lascia un messaggio. La biblioteca collegata soddisfa effettivamente le esigenze del richiedente e non ho alcuna affiliazione ad esso. –

+0

Ho usato quella libreria ed è stato utile per la convalida delle strutture di array. Tuttavia, manca il supporto dei messaggi di errore. Posso solo dire se la validazione è fallita, ma ciò che è andato storto è sconosciuto. –

+0

@DmitriyLezhnev Allora perché non inviare loro alcune richieste di pull per risolverlo? –

0

risposta accettata rendere diff in base ai valori, poiché si tratta di struttura di matrice che non si desidera diff valori. È necessario utilizzare array_diff_key()

La funzione da sola non è ricorsiva. Non funzionerà fuori dalla scatola sulla matrice campione dalla domanda.

Problemi correlati