Иногда перед программистом возникает необходимость проверить, совпадает ли структура у двух массивов. Например, через запрос поступил параметр в виде массива. Тот ли это массив, который нужен или он имеет совершенно другую структуру и, следовательно, работать с ним нужно иначе?
К счастью в PHP есть способ разрешить это вопрос.
В PHP, начиная с версии 4, есть стандартная функция array_keys, которая в общем случае принимает в качестве параметра исходный массив и возвращает массив, содержащий только его ключи.
Ключи в возвращаемом массиве находятся в том же порядке, что и в исходном. Поэтому если два массива имеют одинаковую структуру массивы, которые возвратит для них функция array_keys, будут идентичны.
Рассмотрим два массива:
1 2 |
$array1 = array('page'=>1, 'user'=>"Вася"); $array2 = array('page'=>12, 'user'=>"Маша"); |
Если вызвать для каждого из них функцию array_keys и затем вывести полученный результат при помощи функции var_dump, результат будет в обоих случаях одинаковый.
1 |
array(2) { [0]=> string(4) "page" [1]=> string(4) "user" } |
Таким образом, можно без труда проверить структуру массивов на совпадение.
1 2 3 4 |
if (array_keys($array1)==array_keys($array2)) { // Делаем что-то } |
Также можно создать эталонный массив, содержащий только ключи и проверять исследуемый массив на совпадение с ним.
1 2 3 4 |
if (array_keys($array1)== $standardArray) { // Делаем что-то } |
Однако в обоих случаях есть два нюанса.
1.Проверка только верхнего уровня вложенности
Подобная проверка возможна только для простых массивов, так как функция array_keys формирует результат только из ключей самого верхнего уровня вложенности.
Усложним наш пример.
1 2 |
$array1 = array('page'=>1, 'user'=>array("Name"=>"Вася","LastName"=>"Пупкин","Birdday"=>”01.01.1990)); $array2 = array('page'=>12,'user'=>array("Name"=>"Маша","LastName"=>"Иванова")); |
В данном случае структура массивов различна, однако простая проверка покажет обратное, потому что проверяется лишь верхний уровень вложенности, который у обоих массивов совпадает.
Если же ввести дополнительную проверку для вложенного массива, всё сразу встанет на свои места.
1 2 3 4 5 6 7 8 9 10 11 12 |
if (array_keys($array1)==array_keys($array2)) { // Структура верхнего уровня вложенности совпадает if(array_keys($array1["user"])==array_keys($array2["user"])) { // Структура вложенных массивов совпадает } else { // Структура вложенных массивов не совпадает } } |
Данное обстоятельство необходимо обязательно учитывать при работе с массивами сложной структуры.
2.Игнорирование типа данных элемента массива
Рассматриваемый способ проверки не учитывает тип данных элемента массива. Что создаёт немало трудностей. Особенно с учётом того, что PHP язык с динамической типизацией.
Поэтому крайне желательно помимо ключей проверять ещё и тип данных элементов, которым они соответствуют.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
if (array_keys($array1)==array_keys($array2)) { . . . $match=true; foreach (array_keys($array1) as $key) { if (gettype($array1[$key])==gettype($array2[$key])) { $match=false; } } . . . } |
Безусловно, подобная проверка весьма затратная операция с точки зрения ресурсов, но она необходима для обеспечения корректности работы приложения и надёжного предотвращения исключительных ситуаций.
Зная об обеих вышеописанных особенностях работы с функцией array_keys, можно построить схему проверки структуры любого массива.
Добавить комментарий