Как проверить является ли массив списком или хеш-таблицей?
Массивы в PHP - многолики. Они могут быть как списками так и хеш-таблицами. Так как же определить когда массив в PHP - список, а когда хеш-таблица?
Для начала определимся с терминологией. Списком будем называть массив, содержащий значения, ключи у которых последовательно идут один за другим, начинаясь с 0. Значения списка могу состоять как из простых типов, так и из других списков. Вот примеры массивов - списков:
$list1 = ['a', 'b', 'c', 'd'];
$list2 = [
0 => 'my',
1 => 'ru',
2 => ['sa' => 'kov']
];
Хеш-таблицей будем считать массив, который:
- Содержит один или более не числовых ключей;
- Ключи непоследовательны или не начинаются с нуля.
Примеры массивов - хеш-таблиц в PHP:
$hash1 = [
'my' => 1,
'rus' => true
];
$hash2 = [
2012 => 'HTML Basics',
2014 => 'PHP Guru',
2016 => 'React'
];
$hash3 = [
'string',
'options' => [ 'debug' => false ]
];
А вот непосредственно сами функции, с помощью, которых мы будем проверять массивы:
function array_is_list(array $value)
{
// если $value не массив возвращаем ложь
if (!is_array($value)) return false;
// если массив пустой возвращаем ложь
if (!$value) return false;
// сравниваем значения массива и массив
// в случае списка это будет одно и тоже
return (array_values($value) === $value);
}
function array_is_hash_table(array $value)
{
// если $value не массив возвращаем ложь
if (!is_array($value)) return false;
// если массив пустой возвращаем ложь
if (!$value) return false;
// сравниваем значения массива и массив
// в случае хеш-таблицы это будут разные значения
return (array_values($value) !== $value);
}
Функции для тестирования:
function test_list(array $array) {
print sprintf("Является ли массив %s списком? - %s\n",
// "[" . join(",",$array) . "]",
print_r( $array, 1),
array_is_list($array) ? "Да" : "Нет");
}
function test_hash_table(array $array) {
print sprintf("Является ли массив %s хеш-таблицей - %s\n",
// "[" . join(",",$array) . "]",
print_r( $array, 1),
array_is_hash_table($array) ? "Да" : "Нет");
}
test_list($list1);
test_list($list2);
print(PHP_EOL);
test_hash_table($hash1);
test_hash_table($hash2);
test_hash_table($hash3);
test_hash_table($list1);
Результат:
Является ли массив Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
списком? - Да
Является ли массив Array
(
[0] => my
[1] => ru
[2] => Array
(
[sa] => kov
)
)
списком? - Да
Является ли массив Array
(
[my] => 1
[rus] => 1
)
хеш-таблицей - Да
Является ли массив Array
(
[2012] => HTML Basics
[2014] => PHP Guru
[2016] => React
)
хеш-таблицей - Да
Является ли массив Array
(
[0] => string
[options] => Array
(
[debug] => 1
)
)
хеш-таблицей - Да
Является ли массив Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
хеш-таблицей - Нет
Вот так можно проверить, является ли массив списком или хеш-таблицей.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.