обзор
В предыдущей статье мы говорили оРекурсия на основе фактической структуры данных PHP. Давайте рассмотрим, что такое рекурсия?
В общем случае рекурсией называют вызов самой функции.
Практическое применение рекурсии в разработке
Класс N
Неограниченная классификация является обычным требованием при обычной разработке и встречается во многих вопросах на собеседовании. Каким бы проектом вы ни занимались, вы должны были столкнуться с похожими проблемами. Далее воспользуемся идеей рекурсии и реализуем ее на практике.
- Структура SQL
CREATE TABLE `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`categoryName` varchar(100) NOT NULL,
`parentCategory` int(11) DEFAULT '0',
`sortInd` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
Затем мы маскируем некоторые данные, и, наконец, это выглядит так.
Давайте посмотрим непосредственно на реализацию кода.
<?php
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=light-tips;charset=UTF8;";
$username = 'root';
$password = 'admin';
$pdo = new PDO($dsn, $username, $password);
$sql = 'SELECT * FROM `categories` ORDER BY `parentCategory`, `sortInd`';
$result = $pdo->query($sql, PDO::FETCH_OBJ);
$categories = [];
foreach ($result as $category) {
$categories[$category->parentCategory][] = $category;
}
function showCategoryTree($categories, $n)
{
if (isset($categories[$n])) {
foreach ($categories[$n] as $category) {
echo str_repeat('-', $n) . $category->categoryName . PHP_EOL;
showCategoryTree($categories, $category->id);
}
}
return;
}
showCategoryTree($categories, 0);
Как видите, мы сначала получили все данные, а затем классифицировали их в соответствии с родительским идентификатором. Это потрясающая структура данных. Представьте, что мы разлагаемся, что мы разлагаемся с проблемой отображения всех подкаталеекций в каталоге верхнего уровня, отображая нашу собственную категорию заголовков и подкаталоги, чьи RideCategory - это текущий идентификатор каталога в данных отображения, а затем использует начальный рекурсивный вызов. Окончательный вывод выглядит так.
Неограниченное количество вложенных комментариев
Давайте посмотрим, как выглядит этот бесконечно вложенный комментарий. Как показано на рисунке:
Каштан выше — еще один классический случай, который можно решить с помощью рекурсии. Давайте посмотрим на структуру данных.
CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`comment` varchar(500) NOT NULL,
`username` varchar(50) NOT NULL,
`datetime` datetime NOT NULL,
`parentID` int(11) NOT NULL,
`postID` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
Вы можете практиковать это самостоятельно, не читайте сначала следующий контент.
<?php
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=light-tips;charset=UTF8;";
$username = 'root';
$password = 'admin';
$pdo = new PDO($dsn, $username, $password);
$sql = 'SELECT * FROM `comments` WHERE `postID` = :id ORDER BY `parentId`, `datetime`';
$stmt = $pdo->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_OBJ);
$stmt->execute([':id' => 1]);
$result = $stmt->fetchAll();
$comments = [];
foreach ($result as $comment) {
$comments[$comment->parentID][] = $comment;
}
function showComments(array $comments, $n)
{
if (isset($comments[$n])) {
foreach ($comments[$n] as $comment) {
echo str_repeat('-', $n) . $comment->comment . PHP_EOL;
showComments($comments, $comment->id);
}
}
return;
}
showComments($comments, 0);
сканирование документа
Каштан, который использует рекурсию для сканирования файлов каталога.
<?php
function showFiles(string $dir, array &$allFiles)
{
$files = scandir($dir);
foreach ($files as $key => $value) {
$path = realpath($dir . DIRECTORY_SEPARATOR . $value);
if (!is_dir($path)) {
$allFiles[] = $path;
} else if ($value != "." && $value != "..") {
showFiles($path, $allFiles);
$allFiles[] = $path;
}
}
return;
}
$files = [];
showFiles('.', $files);
foreach ($files as $file) {
echo $file . PHP_EOL;
}
больше контента
Адрес каталога серии тем по базовой структуре данных PHP:github.com/...Он в основном использует синтаксис PHP для обобщения основных структур данных и алгоритмов. Есть также базовые знания, которые легко игнорировать в нашей повседневной разработке PHP, и некоторые практические предложения по спецификации, развертыванию и оптимизации в современной разработке PHP, а также углубленное исследование характеристик языка Javascript.