문제
날짜기간 반복되는 날짜를 처리하기 위한 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
제휴하지 않습니다 StackOverflow