문제

날짜기간 반복되는 날짜를 처리하기 위한 PHP 클래스입니다.방법의 수가 매우 제한되어 있습니다.따라서 반복 날짜를 사용하여 기본적인 배열 기능을 수행하려면 이를 다음과 같은 배열에 복사해야 합니다. iterator_to_array.이상하게도 복사하면 문제가 생기는 것 같습니다.이유가 무엇인가요?

$p=new DatePeriod(date_create('2008-01-01'),
                  DateInterval::createFromDateString( "+2 days" ),
                  date_create('2008-12-31')); 

echo count(iterator_to_array($p)); //183 

$a=iterator_to_array($p); 
echo count($a); //0 
도움이 되었습니까?

해결책

여기 내가 할 일이 있습니다. 확장 할 것입니다 DatePeriod 그리고 구현 a toArray 방법:

class MyDatePeriod extends DatePeriod
{
    public $dates;

    public function toArray()
    {
        if ($this->dates === null) {
            $this->dates = iterator_to_array($this);
        }

        return $this->dates;
    }
}

$p = new MyDatePeriod(date_create('2008-01-01'),
                      DateInterval::createFromDateString( "+2 days" ),
                      date_create('2008-12-31'));

echo count($p->toArray()) . "\n"; // 183

echo count($p->toArray()) . "\n"; // 183

다른 팁

ITERATOR_TO_ARRAY ()에 의해 반복자가 다시 묶이지 않을지 궁금하므로 두 번째 호출은 끝에 커서와 반복하기 시작합니다. 당신은 이것을 시도 할 수 있습니다 :

$p->rewind()
$a=iterator_to_array($p); 

반복기를 다시 표시 할 수없는 경우, 물체를 통과하기 전에 복제를 시도 할 수 있습니다.

$p2 = clone $p;
echo count(iterator_to_array($p2));

$array = iterator_to_array($p);

아마도 첫 번째 호출은 반복자의 모든 요소를 ​​순회합니다(예:valid()가 false가 될 때까지 next()를 호출합니다.합리적인 동작은 iterator_to_array가 반복자의 현재 위치에서 변환을 시작하는 것입니다. 자동으로 되감기하는 것은 융통성이 없으며 버그를 유발할 수도 있습니다.

반복기를 다시 사용하기 전에 되감기를 시도해 보세요.

$p=new DatePeriod(date_create('2008-01-01'),
                  DateInterval::createFromDateString( "+2 days" ),
                  date_create('2008-12-31')); 

echo count(iterator_to_array($p)); //183 

$p->rewind(); // Newly added!

$a=iterator_to_array($p); 
echo count($a); //0
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top