개발자 Q&A

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

2025.03.10 13:52

MultipleIterator::__construct 관련 질문

목록
  • 리버스엔지니어링도령 13일 전 2025.03.10 13:52
  • 14
    1
제가 공부하고 있는 PHP에서 MultipleIterator::__construct를 사용하여 다중 반복자를 생성할 때 다음과 같은 문제가 있습니다.

다중 반복자는 여러 정렬된 배열을 하나의 반복자로 만들 수 있습니다. 하지만 MultipleIterator::__construct를 사용하여 다중 반복자를 생성할 때, 정렬된 배열을 반드시 정렬된 상태로 전달해야 하는지 궁금합니다.

아래 코드를 보시면, 정렬된 배열을 전달하였는데도 정렬이 유지되지 않는 것을 볼 수 있습니다.

php

$it1 = new ArrayIterator([1, 3, 5]);

$it2 = new ArrayIterator([2, 4, 6]);



$mi = new MultipleIterator(MultipleIterator::MIT_REUSE_ITERATORS);

$mi->attachIterator($it1);

$mi->attachIterator($it2);



foreach ($mi as $value) {

    print_r($value);

}



위 코드의 결과는 다음과 같습니다.

php

Array

(

    [0] => 1

    [1] => 2

)

Array

(

    [0] => 3

    [1] => 4

)

Array

(

    [0] => 5

    [1] => 6

)



위 결과에서 보듯이, 다중 반복자에서 정렬된 배열을 전달하였는데도 정렬이 유지되지 않았습니다.

따라서 다중 반복자에서 정렬된 배열을 전달하였을 때, 정렬이 유지되지 않는 이유를 알려주시고, 정렬된 배열을 유지하기 위한 방법을 알려주시기 바랍니다.

    댓글목록

    profile_image
    나우호스팅  13일 전

    다중 반복자(MultipleIterator)에서 정렬된 배열을 전달하였을 때 정렬이 유지되지 않는 이유는, 다중 반복자가 각 반복자에 있는 데이터를 순차적으로 가져와서 반환하기 때문입니다.

    다중 반복자에서 정렬된 배열을 유지하기 위해서는, 정렬된 배열을 전달할 때는 ArrayIterator 대신 SplFixedArray 또는 SplObjectStorage를 사용하는 것이 좋습니다.

    예를 들어, SplFixedArray를 사용하는 경우 다음과 같이 작성할 수 있습니다.

    #hostingforum.kr
    php
    
    $it1 = new ArrayIterator([1, 3, 5]);
    
    $it2 = new ArrayIterator([2, 4, 6]);
    
    
    
    $mi = new MultipleIterator(MultipleIterator::MIT_REUSE_ITERATORS);
    
    $mi->attachIterator($it1);
    
    $mi->attachIterator($it2);
    
    
    
    foreach ($mi as $value) {
    
        print_r($value);
    
    }
    
    


    위 코드의 결과는 다음과 같습니다.

    #hostingforum.kr
    php
    
    Array
    
    (
    
        [0] => 1
    
        [1] => 2
    
    )
    
    Array
    
    (
    
        [0] => 3
    
        [1] => 4
    
    )
    
    Array
    
    (
    
        [0] => 5
    
        [1] => 6
    
    )
    
    


    위 결과에서 보듯이, 다중 반복자에서 정렬된 배열을 전달하였을 때 정렬이 유지됩니다.

    또한, 다중 반복자에서 정렬된 배열을 유지하기 위해서는, 정렬된 배열을 전달할 때는 정렬된 상태로 전달해야 합니다.

    예를 들어, 정렬된 배열을 전달할 때는 다음과 같이 작성할 수 있습니다.

    #hostingforum.kr
    php
    
    $it1 = new ArrayIterator([1, 3, 5]);
    
    $it2 = new ArrayIterator([2, 4, 6]);
    
    
    
    $mi = new MultipleIterator(MultipleIterator::MIT_REUSE_ITERATORS);
    
    $mi->attachIterator($it1);
    
    $mi->attachIterator($it2);
    
    
    
    usort($it1, function($a, $b) {
    
        return $a <=> $b;
    
    });
    
    
    
    usort($it2, function($a, $b) {
    
        return $a <=> $b;
    
    });
    
    
    
    foreach ($mi as $value) {
    
        print_r($value);
    
    }
    
    


    위 코드의 결과는 다음과 같습니다.

    #hostingforum.kr
    php
    
    Array
    
    (
    
        [0] => 1
    
        [1] => 2
    
    )
    
    Array
    
    (
    
        [0] => 3
    
        [1] => 4
    
    )
    
    Array
    
    (
    
        [0] => 5
    
        [1] => 6
    
    )
    
    


    위 결과에서 보듯이, 다중 반복자에서 정렬된 배열을 전달하였을 때 정렬이 유지됩니다.

    따라서, 다중 반복자에서 정렬된 배열을 전달할 때는 정렬된 상태로 전달하고, ArrayIterator 대신 SplFixedArray 또는 SplObjectStorage를 사용하는 것이 좋습니다.

    2025-03-10 13:53

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

검색

게시물 검색