Могу предложить вот такое решение на основе рекурсии.
/**
* Получает из многомерного массива элемент по ключу в виде строки,
* где каждый уровень вложенности отделен точкой, если такой элемент не будет найден,
* то вернет значение по умолчанию
*
* @param $array - многомерный ассоциативный массив
* @param $key - ключ, формата xxx.xxx.xx. Например: db.mysql.host
* @param null $default
*
* @return mixed|null
*/
function arrayGet(array $array, string $key, $default = null)
{
if (!empty($key)) {
//разбиваем вложенность ключей на массив
$levels = explode('.', $key);
//получаем текущий уровень
$currentLevel = array_shift($levels);
//если текущий ключ существует
if (array_key_exists($currentLevel, $array)) {
//если значение текущего ключа является массивом, проверяем этот массив
if (is_array($array[$currentLevel])) {
//рекурсивный вызов с перезаписанными аргументами
return arrayGet($array[$currentLevel], implode('.', $levels), $default);
}
//возвращаем значение по ключу, если оно скалярное
return $array[$currentLevel];
}
}
//возвращаем значение по умолчанию
return $default;
}