Как я могу проверить структуру моих массивов PHP? - PullRequest
13 голосов
/ 27 октября 2010

Существует ли какая-либо функция, обеспечивающая соответствие любого данного массива определенной структуре? Я имею в виду, что у него есть конкретные имена ключей, возможно, определенные типы значений и любая вложенная структура.

Прямо сейчас у меня есть место, где я хочу убедиться, что в массиве, проходящем мимо, есть определенные ключи, пара, содержащая определенный тип данных, и один подмассив с определенными именами ключей. Я много бегал, потому что передавал ему некорректные массивы, и, наконец, я нахожусь в точке, где у меня есть куча

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

Я бы сэкономил много времени и ужасов, если бы мог заранее проверить, что массив соответствует определенной структуре. В идеале что-то вроде

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

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

Итак, я задаю вопрос: это уже существует, или я пишу это сам?

Ответы [ 5 ]

11 голосов
/ 27 октября 2010

Преобразовать массив в JSON:

http://us.php.net/manual/en/function.json-encode.php

Затем проверьте схему JSON:

http://json -schema.org /

http://jsonschemaphpv.sourceforge.net/

7 голосов
/ 27 октября 2010

Он не существует встроенный.

Может быть попробовать что-то вроде (не проверено):

array_diff(array_merge_recursive($arrCandidate, $arrModel), $arrModel)
2 голосов
/ 09 ноября 2017

принятый ответ делает diff на основе значений, поскольку речь идет о структуре массива, которую вы не хотите менять. Во-первых, вы должны использовать array_diff_key ()

Функция одна не является рекурсивной. Это не будет работать из коробки на выборке из вопроса.

1 голос
/ 01 февраля 2016

На GitHub я наткнулся на инструмент Matchmaker, который выглядит очень всеобъемлющим и имеет поддержку композитора и юнит-тесты:
https://github.com/ptrofimov/matchmaker

Вы можете включить его в свой проект с помощью composer require ptrofimov/matchmaker.

1 голос
/ 17 июля 2015

Я знаю, что это своего рода старый пост, извините, если мой ответ не подходит.

Я нахожусь в процессе написания php-пакета, который делает именно то, что вы просите, он называется Structure.

То, что вы можете сделать с пакетом, выглядит примерно так:

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

Вы можете проверить это здесь: http://github.com/3nr1c/structure

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...