PHP

2012-05-08 8 views
22

में ArrayIterator, ArrayObject और Array के बीच अंतर ArrayIterator, ArrayObject और कार्यक्षमता और संचालन के मामले में PHP में ऐरे स्पष्ट रूप से मौलिक मतभेदों को समझा सकता है? धन्यवाद!PHP

+3

क्या आपने [ArrayIterator] (http://www.php.net/ArrayIterator), [ArrayObject] (http://www.php.net/ArrayObject) और [Array] (http: // www। php.net/Array)? शायद आपको वह सारी जानकारी चाहिए जो आपको चाहिए। – vascowhite

+1

इसके अलावा, [स्टैक ओवरफ्लो आपका व्यक्तिगत शोध सहायक नहीं है] (http://meta.stackexchange.com/a/128553/164367) – vascowhite

उत्तर

0

हो सकता है आप यहां अपना उत्तर मिल जाएगा:

यह इटरेटर सेट नहीं की अनुमति देता है और जब तक सरणी और वस्तुओं से अधिक पुनरावृत्ति मूल्यों और चाबी को संशोधित।

आप एक ही सरणी कई बार आप जरूरत ArrayObject का दृष्टांत और यह ArrayIterator उदाहरणों है कि या तो foreach का उपयोग करके या अपने विधि getIterator() मैन्युअल रूप से फोन करके यह उल्लेख करने के लिए बना सकते हैं के लिए खत्म पुनरावृति करना चाहते हैं।

भी पढ़ें:

+12

क्षमा करें मैंने अपना प्रश्न स्पष्ट नहीं किया - हाँ मैंने PHP दस्तावेज़ को पढ़ा है तीन लेकिन ऐसा लगता है जैसे वे एक ही चीज़ करते हैं। मैं सोच रहा था कि क्या कोई यह समझा सकता है कि उनके बीच वास्तविक अंतर क्या था और आप एक दूसरे को क्यों चुनते थे। यदि यह यहां पोस्ट करने के लिए एक उपयुक्त सवाल नहीं है तो मैं क्षमा चाहता हूं और कृपया इस पोस्ट को हटाने के लिए स्वतंत्र महसूस करें! – jkhamler

19

Array एक देशी php प्रकार है। आप PHP भाषा का निर्माण array() का उपयोग कर बना सकते हैं, या php 5.4 के रूप में के बाद []

ArrayObject एक object कि वास्तव में सरणियों की तरह काम करते हैं। इन्हें new कीवर्ड

ArrayIteratorArrayObject की तरह बनाया जा सकता है लेकिन यह स्वयं पर पुन: सक्रिय हो सकता है। इसके अलावा new


बनाम (ArrayObject/ArrayIterator)

Array मुकाबले वे दोनों php के सरणी सिंटैक्स का उपयोग किया जा सकता है उदाहरण के लिए, का उपयोग कर बनाया।

$array[] = 'foo'; 
$object[] = 'foo'; 
// adds new element with the expected numeric key 

$array['bar'] = 'foo'; 
$object['bar'] = 'foo'; 
// adds new element with the key "bar" 

foreach($array as $value); 
foreach($object as $value); 
// iterating over the elements 

हालांकि, वे अभी भी सरणियों बनाम वस्तुओं रहे हैं, तो आप तो का उपयोग कर वस्तुओं कोई त्रुटि फेंक,

is_array($array); // true 
is_array($object); // false 

is_object($array); // false 
is_object($object); // true 

php सरणी कार्यों सरणियों उम्मीद से अधिकांश में अंतर दिखाई जाएगी। ऐसे कई कार्य हैं। उदाहरण के लिए।

sort($array); // works as expected 
sort($object); // Warning: sort() expects parameter 1 to be array, object given in ...... 

अंत में, वस्तुओं क्या आप एक stdClass वस्तु से उम्मीद होती है, यानी बहुत तेजी से वस्तु वाक्य रचना

$object->foo = 'bar'; // works 
$array->foo = 'bar'; // Warning: Attempt to assign property of non-object in .... 

सरणी (देशी प्रकार किया जा रहा है) का उपयोग सार्वजनिक संपत्तियों तक पहुँचने वस्तुओं की तुलना कर रहे हैं कर सकते हैं।दूसरी ओर, ArrayObject & ArrayIterator कक्षाएं कुछ तरीकों को परिभाषित किया है कि आप उपयोग कर सकते हैं, जबकि वहाँ बनाम ArrayIterator

इन 2 के बीच मुख्य अंतर सरणियों


ArrayObject मुकाबले के लिए ऐसी कोई बात है कक्षाओं के तरीकों में है।

ArrayIteratorIterator इंटरफ़ेस लागू करता है जो तत्वों पर पुनरावृत्ति/लूपिंग से संबंधित विधियों को देता है। ArrayObject में exchangeArray नामक एक विधि है जो इसे किसी अन्य के साथ आंतरिक सरणी को स्वैप करती है। ArrayIterator में एक समान चीज़ को कार्यान्वित करने का मतलब या तो & unset कुंजी के माध्यम से एक नया ऑब्जेक्ट बनाना या लूपिंग करना होगा, उनमें से सभी एक & में तत्वों को एक-एक करके नए सरणी से सेट करना होगा।

इसके बाद, के बाद से ArrayObject दोहराया नहीं जा सकता है, जब आप foreach में इसका इस्तेमाल करते हैं यह एक ArrayIterator वस्तु आंतरिक रूप से (सरणियों के रूप में ही) पैदा करता है। इसका मतलब है कि php मूल डेटा & की एक प्रति बनाता है, अब एक ही सामग्री वाले 2 ऑब्जेक्ट्स हैं। यह बड़े सरणी के लिए अक्षम साबित होगा। हालांकि, आप यह निर्दिष्ट कर सकते हैं कि किस वर्ग को इटरेटर के लिए उपयोग करना है, ताकि आपके कोड में कस्टम इटरेटर्स हो सकें।


आशा है कि यह सहायक होगा। इस जवाब में संपादन का स्वागत है।

+0

स्पष्टीकरण सरणी के बारे में है Iterator सभी गलत है। मेरा जवाब पढ़ें। – David

7

ऐरेऑब्जेक्ट और सरणी कुछ हद तक समान हैं। केवल वस्तुओं का संग्रह (या मूल प्रकार)। उनके पास कुछ अलग-अलग विधियां हैं जिन्हें आप कॉल कर सकते हैं, लेकिन यह ज्यादातर एक ही चीज़ पर उबाल जाता है।

हालांकि, एक इटरेटर पूरी तरह से कुछ और है। इटरेटर डिज़ाइन पैटर्न आपके सरणी को सुरक्षित करने का एक तरीका है (इसे केवल पठनीय बनाना)। आइए अगले उदाहरण लें:

आपके पास एक कक्षा है जिसमें एक सरणी है। आप addSomethingToMyArray का उपयोग कर उस सरणी में आइटम जोड़ सकते हैं। ध्यान दें, हालांकि, हम इसे वास्तव में सरणी में जोड़ने से पहले आइटम पर कुछ करते हैं। यह कुछ भी हो सकता है, लेकिन एक क्षण के कार्य की तरह यह बहुत महत्वपूर्ण है कि इस विधि को हर आइटम के लिए निकाल दिया जाता है जिसे हम सरणी में जोड़ना चाहते हैं।

class A 
{ 
    private $myArray; 
    public function returnMyArray() 
    { 
     return $this->myArray; 
    } 

    public function addSomethingToMyArray($item) 
    { 
     $this->doSomethingToItem($item); 
     array_push($item); 
    } 
} 

इसके साथ समस्या यह है कि आप यहां संदर्भ द्वारा सरणी पास करते हैं। इसका मतलब है कि वास्तव में वापसी का उपयोग करने वाले वर्ग MyArray वास्तविक myArray ऑब्जेक्ट प्राप्त करते हैं। इसका मतलब है कि ए के अलावा अन्य वर्ग उस सरणी में चीजें जोड़ सकते हैं, और addSOmethingToMyArray का उपयोग किये बिना ए के अंदर सरणी भी बदल सकते हैं। लेकिन हमें ऐसा करने की ज़रूरत थी, कुछ याद रखने के लिए, याद है? यह एक वर्ग का एक उदाहरण है जो अपनी आंतरिक स्थिति के नियंत्रण में नहीं है।

इसका समाधान एक पुनरावर्तक है। सरणी को पार करने के बजाय, हम सरणी को एक नई वस्तु में पास करते हैं, जो केवल सरणी से चीजें पढ़ सकता है। सबसे सरल इटरेटर कभी ऐसा कुछ है:

<?php 

class MyIterator{ 

    private $array; 
    private $index; 

    public function __construct($array) 
    { 
     $this->array = $array; 
    } 

    public function hasNext() 
    { 
     return count($this->array) > $this->index; 
    } 

    public function next() 
    { 
     $item = $this->array[ $this->index ]; 
     this->$index++; 

     return $item; 
    }  
} 

?>

आप देख सकते हैं, मैं दिया सरणी के लिए नए आइटम जोड़ने का कोई तरीका नहीं है, लेकिन मैं इस तरह सरणी को पढ़ने के लिए posibilities है:

while($iterator->hasNext()) 
    $item = $iterator->next(); 

अब फिर से है, सिर्फ एक ही रास्ता ए में myArray में आइटम जोड़ने के लिए, अर्थात् addSomethingToArray विधि के माध्यम से। तो यह एक इटरेटर है, यह कुछ हद तक सरणी के रूप में एक खोल है, जिसे encapsulation कहा जाता है।

0

array PHP में आठ आदिम प्रकार हैं। हालांकि यह बहुत से अंतर्निहित उपयोगिता कार्यों के साथ आता है, लेकिन वे सभी प्रक्रियात्मक हैं।

ArrayObject और ArrayIterator दोनों हमें ऑब्जेक्ट उन्मुख प्रोग्राम (ओओपी) में प्रथम श्रेणी के नागरिकों को सरणी बनाने की अनुमति देते हैं।

ArrayObject और ArrayIterator के बीच

अंतर यह है कि, के बाद से ArrayIteratorSeekableIterator इंटरफ़ेस लागू करता है, तो आप ArrayIterator साथ $myArray->seek(10); कर सकते हैं।

0

एक Iterator एक ऐसा ऑब्जेक्ट है जो प्रोग्रामर को एक कंटेनर, विशेष रूप से सूचियों को पार करने में सक्षम बनाता है। कई प्रकार के इटरेटर अक्सर एक कंटेनर इंटरफ़ेस के माध्यम से प्रदान किए जाते हैं।

ArrayObject और Array के बीच कोई अंतर नहीं है क्योंकि वे अलग-अलग ऑब्जेक्ट प्रकारों का उपयोग करने के बावजूद वही चीजों का प्रतिनिधित्व करते हैं।

ArrayIterator एक इटरेटर कि Array-like वस्तुओं से अधिक दोहराता, यह सभी वस्तुओं है कि ArrayAcess को लागू करने और देशी Array प्रकार शामिल है। वास्तव में, जब आप foreach एक सरणी से अधिक, पीएचपी आंतरिक ArrayIterator बनाता traversing करते हैं और देखने के लिए अपने कोड को बदलने के रूप में अगर यह आपके द्वारा लिखा गया है,

for($arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator- 
>next()) 
{ $key = $arrayIteartor->key(); 
    $value = $arrayIterator->current(); 
} 

तो आप देख सकते है, हर संग्रह वस्तु के अलावा एक इटरेटर है आपके परिभाषित संग्रह जिन्हें आपको अपने स्वयं के इटरेटर को परिभाषित करने की आवश्यकता है।