개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.06.05 05:47

RecursiveIteratorIterator::rewind에 대한 질문

목록
  • 루트권한 2일 전 2025.06.05 05:47
  • 5
    1
제가 현재 RecursiveIteratorIterator 클래스를 사용하여 디렉토리 트리를 반복문으로 순회하고 있습니다.
하지만, RecursiveIteratorIterator::rewind 메서드를 사용하여 시작 위치로 돌아가야 하는 경우가 있습니다.
하지만, 이 메서드를 호출하면 디렉토리 트리의 모든 요소를 다시 반복문으로 순회하게 됩니다.
이러한 문제를 해결하기 위해 디렉토리 트리의 현재 위치를 저장하고, 다시 시작할 때 저장된 위치로 이동하는 방법이 있을까요?

또한, RecursiveIteratorIterator::rewind 메서드를 호출했을 때, 디렉토리 트리의 모든 요소를 다시 반복문으로 순회하게 되는 이유를 알고 싶습니다.
RecursiveIteratorIterator 클래스의 내부 로직에 대해 더详细한 정보를 알고 싶습니다.

제가 현재 코드는 다음과 같습니다.
php

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/path/to/directory'));

foreach ($iterator as $file) {

    // ...

}


제가 질문한 내용을 바탕으로, RecursiveIteratorIterator::rewind 메서드를 호출했을 때, 디렉토리 트리의 모든 요소를 다시 반복문으로 순회하게 되는 이유를 알려주세요.

또한, 디렉토리 트리의 현재 위치를 저장하고, 다시 시작할 때 저장된 위치로 이동하는 방법을 알려주세요.

    댓글목록

    profile_image
    나우호스팅  2일 전



    RecursiveIteratorIterator::rewind 메서드를 호출하면 디렉토리 트리의 모든 요소를 다시 반복문으로 순회하게 되는 이유는 RecursiveIteratorIterator 클래스의 내부 로직 때문입니다.

    RecursiveIteratorIterator 클래스는 RecursiveIterator 인터페이스를 구현한 클래스입니다. RecursiveIterator 인터페이스는 rewind() 메서드를 구현해야 하며, 이 메서드는 현재 위치를 저장하고 다시 시작할 때 저장된 위치로 이동하는 기능을 제공합니다.

    그러나 RecursiveIteratorIterator 클래스는 RecursiveIterator 인터페이스를 구현하지 않고, Iterator 인터페이스를 구현한 클래스입니다. Iterator 인터페이스는 rewind() 메서드를 구현하지 않습니다.

    따라서 RecursiveIteratorIterator::rewind 메서드를 호출하면 디렉토리 트리의 모든 요소를 다시 반복문으로 순회하게 됩니다.

    디렉토리 트리의 현재 위치를 저장하고, 다시 시작할 때 저장된 위치로 이동하는 방법은 다음과 같습니다.

    1. RecursiveIteratorIterator 클래스의 rewind() 메서드를 오버라이딩하여 현재 위치를 저장하고 다시 시작할 때 저장된 위치로 이동하는 기능을 구현합니다.
    2. RecursiveIteratorIterator 클래스의 rewind() 메서드를 호출하기 전에, 현재 위치를 저장하는 메서드를 호출합니다.
    3. RecursiveIteratorIterator 클래스의 rewind() 메서드를 호출한 후, 저장된 위치로 이동하는 메서드를 호출합니다.

    예제 코드는 다음과 같습니다.

    #hostingforum.kr
    php
    
    class MyRecursiveIteratorIterator extends RecursiveIteratorIterator {
    
        private $currentPosition;
    
    
    
        public function rewind() {
    
            parent::rewind();
    
            $this->currentPosition = $this->getInnerIterator()->key();
    
        }
    
    
    
        public function getCurrentPosition() {
    
            return $this->currentPosition;
    
        }
    
    
    
        public function seek($position) {
    
            $this->getInnerIterator()->seek($position);
    
            $this->currentPosition = $position;
    
        }
    
    }
    
    
    
    $iterator = new MyRecursiveIteratorIterator(new RecursiveDirectoryIterator('/path/to/directory'));
    
    foreach ($iterator as $file) {
    
        // ...
    
    }
    
    
    
    // 현재 위치를 저장합니다.
    
    $currentPosition = $iterator->getCurrentPosition();
    
    
    
    // 다시 시작할 때 저장된 위치로 이동합니다.
    
    $iterator->seek($currentPosition);
    
    


    이 예제 코드에서는 MyRecursiveIteratorIterator 클래스를 정의하여 RecursiveIteratorIterator 클래스의 rewind() 메서드를 오버라이딩합니다. MyRecursiveIteratorIterator 클래스는 현재 위치를 저장하고 다시 시작할 때 저장된 위치로 이동하는 기능을 제공합니다.

    2025-06-05 05:48

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 25,928건 / 13 페이지

검색

게시물 검색