ParseKey($key); // Получаем текущий массив данных $current = $this->JsonData; // Для каждого ключа foreach ($keys as $key) { // - проверяем наличие ключа в текущем массиве if (!array_key_exists($key, $current)) // - нет? Возвращаем false return false; // Переходим ко вложенному массиву $current = $current[$key]; } // Возвращаем true, если все ключи найдены return true; } /** * Получение ключей по вложенности. Т.е., ключи вида "key1/key2/key3" => ["key1", "key2", "key3"]. * * @param string $key Ключ. * * @return array Ключи по вложенности. */ private function ParseKey (string $key): array { // Очищаем ключ $key = $this->PrepareKey($key); // Разбиваем ключ на части return explode('/', $key); } /** * Подготавливает ключ к использованию внутри методов. * * @param string $key Неочищенный ключ. * * @return string Очищенный ключ. */ private function PrepareKey (string $key): string { return trim($key, "/ "); } /** * Получение списка ключей. * * @param string $parentKey Ключ родителя (или "" (установлено по умолчанию) для всех). * @param bool $includeChildren Нужно ли включать дочерние ключи (по умолчанию, да). * * @return array Список ключей. */ public function GetKeys (string $parentKey = "", bool $includeChildren = true): array { // Очищаем ключ $parentKey = $this->PrepareKey($parentKey); // Разбиваем ключ на части $keys = StringExtension::IsNullOrWhitespace($parentKey) ? [] : $this->ParseKey($parentKey); // Получаем текущий массив данных $current = $this->JsonData; // Если ключ не является корневым if (count($keys) > 0) // - переходим к вложенному массиву for ($i = 0; $i < count($keys); $i++) // -- и добавляем массив данных $current = $current[$keys[$i]]; // Получаем список ключей родителя $parentKeysList = array_keys($current); // Если не нужно включать дочерние ключи if (!$includeChildren) // - возвращаем список родительских ключей return $parentKeysList; // Создаем результирующий массив $result = []; // Для каждого ключа foreach ($parentKeysList as $key) { // - очищаем текущий ключ $currentKey = $this->PrepareKey($parentKey . "/" . $key); // - добавляем его в результирующий массив $result[] = $currentKey; // - если у текущего ключа есть дочерние ключи if (is_array($current[$key])) // -- добавляем их в результирующий массив $result = array_merge($result, $this->GetKeys($currentKey)); } // Возвращаем результирующий массив return $result; } }