आप इस उद्देश्य के लिए CachingIterator उपयोग कर सकते हैं:
तो तुम कुछ इस तरह कर सकता है। ,
var_dump($collection->current()); // null
var_dump($collection->getInnerIterator()->current()); // Cat
इस प्रकार जब आप foreach
$collection
से अधिक, भीतरी ArrayIterator की वर्तमान तत्व कार्य करें:
$collection = new CachingIterator(
new ArrayIterator(
array('Cat', 'Dog', 'Elephant', 'Tiger', 'Shark')));
CachingIterator हमेशा भीतरी इटरेटर के पीछे एक कदम है:
यहाँ एक उदाहरण है पहले से ही तत्व होगा, जिससे आप इसमें देख सकेंगे:
foreach($collection as $animal) {
echo "Current: $animal";
if($collection->hasNext()) {
echo " - Next:" . $collection->getInnerIterator()->current();
}
echo PHP_EOL;
}
विल उत्पादन:
Current: Cat - Next:Dog
Current: Dog - Next:Elephant
Current: Elephant - Next:Tiger
Current: Tiger - Next:Shark
Current: Shark
किसी कारण मैं व्याख्या नहीं कर सकते के लिए, CachingIterator हमेशा स्ट्रिंग के लिए वर्तमान तत्व परिवर्तित करने के लिए कोशिश करेंगे। यदि आप किसी ऑब्जेक्ट संग्रह पर पुन: प्रयास करना चाहते हैं और गुणों को किसी विधियों तक पहुंचने की आवश्यकता है, तो निर्माता को दूसरे पैरा के रूप में CachingIterator::TOSTRING_USE_CURRENT
पास करें।
एक sidenote पर, CachingIterator परिणाम ही सब यह अब तक अधिक दोहराया गया है कैश करने के लिए क्षमता से नाम है हो जाता है। इसके लिए काम करने के लिए, आपको CachingIterator::FULL_CACHE
के साथ इसे तुरंत चालू करना होगा और फिर आप कैश किए गए परिणामों को getCache()
के साथ ला सकते हैं।
+1 इन्हें भी नहीं पता था ([x] Iterators) बहुत उपयोगी, निर्देशिकाइटरेटर espec।अगली बार जब मैं फाइल सामान कर रहा हूं तो यह मुझे काम का एक बड़ा भार बचाने जा रहा है। धन्यवाद :) – Psytronic
@Psytronic वे वास्तव में साफ हैं। उन्हें ढेर करने की क्षमता बहुत अच्छी और लचीली सामग्री के लिए अनुमति देता है। दुर्भाग्यवश, खराब दस्तावेज हैं, लेकिन http://www.phpro.org/tutorials/Introduction-to-SPL.html – Gordon
दुर्भाग्य से, यदि सरणी में ऑब्जेक्ट्स हैं और तार नहीं हैं तो समाधान काम नहीं करता है। मुझे निम्नलिखित अपवाद मिलते हैं: 'कैच करने योग्य घातक त्रुटि: कक्षा MySampleClass का ऑब्जेक्ट लाइन 3 9 8' – pako