У меня есть функция, которая должна принимать массив точек или массив точек (2 или 3-мерный массив). Я ищу надежный способ определить, имеет ли он 2 или 3 уровня. Дело в том, что я не могу рассчитывать на ключи массивов, чтобы выполнить проверку, так что это не работа:
$levels = isset($array[0][0]) && is_array($array[0][0]) ? 3 : 2;
.. поскольку первый ключ может не быть 0. Обычно это так, но я не хочу на это полагаться. И в любом случае, это дерьмовый и недалекий способ сделать это. Оптимально, я хотел бы проверить на любое количество уровней без необходимости проходить через весь массив.
Вот как могут выглядеть массивы:
array(5) {
[2] => array(2) {
[x] => 3
[y] => 6
}
[3] => array(2) {
[x] => 4
[y] => 8
}
...
И трехмерный массив будет содержать эти массивы.
Некоторые заметки:
- Массивы большие, поэтому полный цикл по массивам не очень хороший вариант
- Массивы индексируются численно и последовательно (за исключением последнего уровня, в котором есть x и y)
- Ключи массива могут начинаться или не начинаться с 0
При написании этого я нашел решение, которое могло бы быть осуществимым; рекурсивная функция, которая проверяет первый элемент массива, если он есть, затем вызывает себя во вновь найденном массиве и т. д.
Есть ли лучшие, более чистые идеи? Бонусные баллы за поддержку массивов, которые могут иметь как скалярные значения, так и массивы (например, первый элемент массива может быть строкой, а следующий - массивом).