> 백엔드 개발 > PHP 튜토리얼 > PHP의 무제한 분류 및 무한 중첩 주석

PHP의 무제한 분류 및 무한 중첩 주석

步履不停
풀어 주다: 2023-04-06 21:24:02
원래의
2945명이 탐색했습니다.

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의 무제한 분류 및 무한 중첩 주석

코드 구현을 직접 살펴보겠습니다.

<?php $dsn = "mysql:host=127.0.0.1;port=3306;dbname=light-tips;charset=UTF8;";
$username = &#39;root&#39;;
$password = &#39;admin&#39;;
$pdo = new PDO($dsn, $username, $password);
$sql = &#39;SELECT * FROM `categories` ORDER BY `parentCategory`, `sortInd`&#39;;
$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);
로그인 후 복사

보시다시피 먼저 모든 데이터를 얻은 다음 상위 ID에 따라 분류했습니다. 이것은 훌륭한 데이터 구조입니다. 최상위 디렉터리 아래의 모든 하위 디렉터리를 표시하는 문제를 자체 범주 제목을 표시하고 parentCategory가 데이터의 현재 디렉터리 ID인 하위 디렉터리를 표시한 다음 를 사용하여 재귀 호출을 시작하는 문제를 분해한다고 상상해 보세요. 최종 출력은 다음과 같습니다.

PHP의 무제한 분류 및 무한 중첩 주석

무한 중첩 댓글

먼저 무한 중첩 댓글이 어떤 모습인지 살펴보겠습니다. 그림에 표시된 대로:

PHP의 무제한 분류 및 무한 중첩 주석

위의 밤나무는 재귀를 사용하여 풀 수 있는 또 다른 고전적인 사례입니다. 데이터 구조를 살펴보겠습니다.

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 = &#39;root&#39;;
$password = &#39;admin&#39;;
$pdo = new PDO($dsn, $username, $password);
$sql = &#39;SELECT * FROM `comments` WHERE `postID` = :id ORDER BY `parentId`, `datetime`&#39;;
$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 관련 기술 기사를 더 보려면 PHP Tutorial 칼럼을 방문하여 알아보세요!

위 내용은 PHP의 무제한 분류 및 무한 중첩 주석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿