Как я могу проверить структуру своих массивов PHP?

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

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

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 ) ) { ... }

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

Ответ 1

Он не существует.

Возможно, попробуйте что-то вроде (untested):

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

Ответ 3

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

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

Что вы можете сделать с пакетом, это что-то вроде:

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

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

Ответ 4

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

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

Ответ 5

Создайте массив, определяющий вашу структуру, а затем перейдите к циклу массива, который вы хотите проверить, и сравните его с определенной структурой массива.

Ответ 6

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

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