2009-09-15 9 views
7

DatePeriod पुनरावर्ती तिथियों को संभालने के लिए एक PHP कक्षा है। इसमें बहुत सीमित विधियां हैं। इसलिए जब मैं पुनरावर्ती तिथियों के साथ मूल सरणी कार्य करना चाहता हूं, तो मुझे इसे iterator_to_array के साथ एक सरणी में कॉपी करना होगा। आश्चर्यजनक रूप से, इसे कॉपी करना इसे पकड़ना प्रतीत होता है। कोई विचार क्यों?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 
+0

खेद दो वर्षीय पोस्ट टक्कर करने के लिए लेकिन क्यों यह हो रहा है कि आप पता लगाने के लिए प्रबंधन किया था? – calumbrodie

उत्तर

3

यहां मैं क्या करूँगा। मैं DatePeriod का विस्तार करने और एक 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 
+0

मुझे समझ में नहीं आता कि कक्षा के अंदर से iterator_to_array ($ यह) क्यों बाहर से iterator_to_array ($ p) जैसा नहीं है। लेकिन मुझे यकीन है कि यह खुश है! बहुत बहुत धन्यवाद। – dnagirl

+1

यह वही करता है, लेकिन मैं परिणाम को एक आवृत्ति चर, '$ तिथियां' में कैश कर रहा हूं, इसलिए उपसेक पर 'toArray' को कॉल करने के लिए' iterator_to_array' पर कोई और कॉल नहीं है। मैंने बस कैश किए गए परिणाम को वापस कर दिया है। –

3

मुझे आश्चर्य है अगर शायद इटरेटर किया जा रहा iterator_to_array() द्वारा फिर से घाव नहीं है, इसलिए दूसरी कॉल अंत में कर्सर के साथ पुनरावृत्ति शुरू होता है। आप इस कोशिश कर सकते: इटरेटर rewindable नहीं है

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

हैं, तो आप इससे पहले कि आप को पार करता है, उदा वस्तु क्लोनिंग की कोशिश कर सकते

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

$array = iterator_to_array($p); 
+0

ऐसा प्रतीत होता है कि डेटपीरियोड में रिवाइंड विधि नहीं है। :( प्रलेखन का कहना है कि डेटपेरियोड ट्रैवर्सबल लागू करता है। लेकिन ट्रैवर्सबल एक अमूर्त इंटरफ़ेस है जिसके लिए इटरेटर या इटरेटर एग्रेगेट को कार्यान्वित करने की आवश्यकता होती है (इनमें से कोई भी डेटपेरियोड डॉक्स में उल्लिखित नहीं है)। इटरेटरएग्रेगेट में सार्वजनिक रिवाइंड विधि नहीं दिखती है, इसलिए शायद डेटपेरियोड इटरेटर की बजाय इसका एक बच्चा है? – dnagirl

+0

अफसोस की बात है, क्लोन एक विकल्प नहीं है। ऐसा लगता है कि यह एक घातक त्रुटि है, लेकिन मुझे किस प्रकार का पता नहीं है क्योंकि यह वेब लॉग में दिखाई नहीं देता है। – dnagirl

+1

जहां तक ​​मुझे चिंतित है कि PHP 5.3 में नई तिथि और समय कार्यान्वयन बड़ा समय चूसता है। –

2

मुमकिन है, पहली कॉल इटरेटर के सभी तत्वों को पार करता है (यानी अगले कॉल() वैध जब तक() गलत है)। समझदार व्यवहार iterator_to_array के लिए iterator में वर्तमान स्थिति से रूपांतरण शुरू करने के लिए है - इसे चुपचाप रिवाइंड होने से लचीला, और संभवतः बग प्रेरण होगा।

पुन: उपयोग करने से पहले इसे पुनरावर्तक करने का प्रयास करें।

$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