2010-10-27 5 views
11

¿Existe alguna función para asegurarse de que cualquier matriz determinada se ajuste a una estructura en particular? Lo que quiero decir es que tiene nombres de teclas particulares, quizás tipos particulares para valores y cualquier estructura anidada.¿Cómo puedo validar la estructura de mis matrices PHP?

Ahora mismo tengo un lugar donde quiero para asegurarse de que la matriz tiene conseguir más allá de ciertas teclas, una pareja con un cierto tipo de datos, y una sub-matriz con determinados nombres clave. He hecho un montón de carrera alrededor porque yo estaba pasando matrices mal formados a ella, y finalmente estoy en el punto en el que tengo un montón de

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

me habría ahorrado un montón de tiempo y consternación si hubiera podido comprobar que la matriz se ajustaba a una estructura particular de antemano. Lo ideal sería algo así como

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

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

Por lo tanto, la pregunta que estoy haciendo es, hace esto ya existe, o debo escribir esto mismo?

Respuesta

6

NO EXISTE construido en

Tal vez intente algo así (no probado):

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

Creo que te refieres a array_merge_recursive –

+0

Lo hice, gracias. (Actualizado) –

0

crear una matriz que define su estructura, y luego ir a través de un bucle de la matriz que desea comprobar y compararlo con la estructura de matriz que ha definido.

1

Sé que esto es una especie de un antiguo puesto, lo siento si mi respuesta es no approppriate.

estoy en el proceso de escribir un paquete php que hace exactamente lo que está pidiendo, se llama Estructura.

Lo que puede hacer con el paquete es algo así como:

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

Puede echarle un vistazo aquí: http://github.com/3nr1c/structure

1

me encontré con una herramienta llamada Matchmaker en GitHub, que se ve muy amplia y tiene apoyo compositor y pruebas unitarias:
https://github.com/ptrofimov/matchmaker

se puede incluir en su proyecto con composer require ptrofimov/matchmaker.

+0

A los votantes al azar: ¿por qué? Por favor, deje un mensaje. La biblioteca enlazada realmente satisface las necesidades del solicitante, y no tengo ninguna afiliación a ella. –

+0

Utilicé esa lib y fue buena para validar estructuras de matriz. Sin embargo, carece de soporte de mensajes de error. Solo puedo decir si la validación falló, pero se desconoce qué fue exactamente lo que salió mal. –

+0

@DmitriyLezhnev Entonces, ¿por qué no enviarles algunas solicitudes de extracción para arreglarlo? –

0

aceptado respuesta diff marca basada en valores, ya que se trata de la estructura de matriz que no quiere a los valores de diferenciación. Insted se debe utilizar array_diff_key()

función por sí sola no es recursivo. No funcionará de la caja en la matriz de muestra de la pregunta.