>  기사  >  백엔드 개발  >  PHP의 무제한 분류 및 무한 중첩 주석

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

不言
不言원래의
2018-07-07 15:42:141699검색

이 글은 주로 PHP의 무한 분류와 무한 중첩 주석을 소개합니다. 이제 특정 참조 가치가 있으므로 도움이 필요한 친구들이 참고할 수 있도록 공유합니다.

Review

이전 글에서 실용적인 재귀에 대해 이야기했습니다. 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 데이터 구조 기반 재귀

XHProf를 사용하여 PHP 성능 병목 현상을 분석하는 방법 2

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.