구현 방법: 1. 배열을 만들고 탐색할 디렉터리를 넣습니다. 2. 배열을 처리하는 루프입니다. 루프 종료 조건은 배열이 비어 있다는 것입니다. 4. 이 요소가 디렉터리인 경우 디렉터리의 모든 하위 요소를 배열에 추가한 다음 배열이 빌 때까지 요소를 처리합니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터
디렉토리(하위 디렉토리 포함)에 있는 모든 파일을 탐색하려는 경우 가장 먼저 떠오르는 아이디어는 재귀를 사용하는 것이 중요합니다. 현재 디렉터리를 먼저 처리한 다음 현재 디렉터리 아래의 하위 디렉터리를 처리합니다. 재귀없이 가능합니까? 예전에 자료구조 공부할 때 본 적이 있는데, 실제로 재귀는 스택을 이용해서 구현되는데, 재귀의 특징은 마지막 호출이 먼저 실행되고, 마지막 호출이 두 번째로 실행된다는 것입니다. 초기 호출은 마지막으로 실행됩니다. 재귀의 원리를 이해하면 실제로 모든 재귀 구현을 비재귀 구현으로 변환할 수 있습니다.
비재귀적으로 디렉터리의 모든 파일을 탐색합니다. 아이디어는 주로 다음 단계로 나뉩니다.
배열을 만들고 탐색할 디렉터리를 넣습니다. 배열 스택)
루프에서 이 배열을 처리합니다. 루프 종료 조건은 배열이 비어 있다는 것입니다.
각 루프에서는 배열의 한 요소를 처리하고 요소를 삭제합니다.
이 요소가 디렉터리인 경우 디렉터리의 모든 하위 요소를 배열에 추가한 다음 배열이 빌 때까지 요소를 처리합니다.
이 아이디어에 따라 작성된 코드는 다음과 같습니다.
<?php /** * 遍历某个目录下的所有文件 * @param string $dir */ function scanAll($dir) { $list = array(); $list[] = $dir; while (count($list) > 0) { //弹出数组最后一个元素 $file = array_pop($list); //处理当前文件 echo $file."\r\n"; //如果是目录 if (is_dir($file)) { $children = scandir($file); foreach ($children as $child) { if ($child !== '.' && $child !== '..') { $list[] = $file.'/'.$child; } } } } } ?>
여기서는 재귀가 큰 단점이 없다고 생각합니다. 실제로 재귀를 사용하여 디자인하는 것은 여전히 매우 간결합니다. 및 읽기 가능, 효율성 문제의 경우 재귀 깊이가 특별히 크지 않는 한 영향을 미칩니다.
다음은 비교를 위해 재귀를 이용한 구현입니다.
<?php /** * 遍历某个目录下的所有文件(递归实现) * @param string $dir */ function scanAll2($dir) { echo $dir."\r\n"; if (is_dir($dir)) { $children = scandir($dir); foreach ($children as $child) { if ($child !== '.' && $child !== '..') { scanAll2($dir.'/'.$child); } } } } ?>
두 함수의 결과가 주로 인쇄 순서에서 약간씩 다른 것을 알 수 있습니다. 스택을 밀어넣는 순서가 scandir이 나오는 순서와 정확히 반대이기 때문에 함수 1의 실행 결과 순서가 반대입니다. 21번째 줄을 변경할 수 있습니다.
$children = array_reverse(scandir($file));
권장 학습: "PHP 비디오 튜토리얼 "
위 내용은 재귀없이 PHP에서 디렉토리의 모든 파일을 탐색하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!