में ArrayIterator, ArrayObject और Array के बीच अंतर ArrayIterator
, ArrayObject
और कार्यक्षमता और संचालन के मामले में PHP में ऐरे स्पष्ट रूप से मौलिक मतभेदों को समझा सकता है? धन्यवाद!PHP
PHP
उत्तर
हो सकता है आप यहां अपना उत्तर मिल जाएगा:
यह इटरेटर सेट नहीं की अनुमति देता है और जब तक सरणी और वस्तुओं से अधिक पुनरावृत्ति मूल्यों और चाबी को संशोधित।
आप एक ही सरणी कई बार आप जरूरत ArrayObject का दृष्टांत और यह ArrayIterator उदाहरणों है कि या तो foreach का उपयोग करके या अपने विधि getIterator() मैन्युअल रूप से फोन करके यह उल्लेख करने के लिए बना सकते हैं के लिए खत्म पुनरावृति करना चाहते हैं।
भी पढ़ें:
क्षमा करें मैंने अपना प्रश्न स्पष्ट नहीं किया - हाँ मैंने PHP दस्तावेज़ को पढ़ा है तीन लेकिन ऐसा लगता है जैसे वे एक ही चीज़ करते हैं। मैं सोच रहा था कि क्या कोई यह समझा सकता है कि उनके बीच वास्तविक अंतर क्या था और आप एक दूसरे को क्यों चुनते थे। यदि यह यहां पोस्ट करने के लिए एक उपयुक्त सवाल नहीं है तो मैं क्षमा चाहता हूं और कृपया इस पोस्ट को हटाने के लिए स्वतंत्र महसूस करें! – jkhamler
Array
एक देशी php प्रकार है। आप PHP भाषा का निर्माण array()
का उपयोग कर बना सकते हैं, या php 5.4 के रूप में के बाद []
ArrayObject
एक object
कि वास्तव में सरणियों की तरह काम करते हैं। इन्हें new
कीवर्ड
ArrayIterator
ArrayObject
की तरह बनाया जा सकता है लेकिन यह स्वयं पर पुन: सक्रिय हो सकता है। इसके अलावा 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
मुकाबले के लिए ऐसी कोई बात है कक्षाओं के तरीकों में है।
ArrayIterator
Iterator
इंटरफ़ेस लागू करता है जो तत्वों पर पुनरावृत्ति/लूपिंग से संबंधित विधियों को देता है। ArrayObject
में exchangeArray
नामक एक विधि है जो इसे किसी अन्य के साथ आंतरिक सरणी को स्वैप करती है। ArrayIterator
में एक समान चीज़ को कार्यान्वित करने का मतलब या तो & unset
कुंजी के माध्यम से एक नया ऑब्जेक्ट बनाना या लूपिंग करना होगा, उनमें से सभी एक & में तत्वों को एक-एक करके नए सरणी से सेट करना होगा।
इसके बाद, के बाद से ArrayObject
दोहराया नहीं जा सकता है, जब आप foreach
में इसका इस्तेमाल करते हैं यह एक ArrayIterator
वस्तु आंतरिक रूप से (सरणियों के रूप में ही) पैदा करता है। इसका मतलब है कि php मूल डेटा & की एक प्रति बनाता है, अब एक ही सामग्री वाले 2 ऑब्जेक्ट्स हैं। यह बड़े सरणी के लिए अक्षम साबित होगा। हालांकि, आप यह निर्दिष्ट कर सकते हैं कि किस वर्ग को इटरेटर के लिए उपयोग करना है, ताकि आपके कोड में कस्टम इटरेटर्स हो सकें।
आशा है कि यह सहायक होगा। इस जवाब में संपादन का स्वागत है।
स्पष्टीकरण सरणी के बारे में है Iterator सभी गलत है। मेरा जवाब पढ़ें। – David
ऐरेऑब्जेक्ट और सरणी कुछ हद तक समान हैं। केवल वस्तुओं का संग्रह (या मूल प्रकार)। उनके पास कुछ अलग-अलग विधियां हैं जिन्हें आप कॉल कर सकते हैं, लेकिन यह ज्यादातर एक ही चीज़ पर उबाल जाता है।
हालांकि, एक इटरेटर पूरी तरह से कुछ और है। इटरेटर डिज़ाइन पैटर्न आपके सरणी को सुरक्षित करने का एक तरीका है (इसे केवल पठनीय बनाना)। आइए अगले उदाहरण लें:
आपके पास एक कक्षा है जिसमें एक सरणी है। आप 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 कहा जाता है।
array
PHP में आठ आदिम प्रकार हैं। हालांकि यह बहुत से अंतर्निहित उपयोगिता कार्यों के साथ आता है, लेकिन वे सभी प्रक्रियात्मक हैं।
ArrayObject
और ArrayIterator
दोनों हमें ऑब्जेक्ट उन्मुख प्रोग्राम (ओओपी) में प्रथम श्रेणी के नागरिकों को सरणी बनाने की अनुमति देते हैं।
ArrayObject
और
ArrayIterator
के बीच
अंतर यह है कि, के बाद से ArrayIterator
SeekableIterator
इंटरफ़ेस लागू करता है, तो आप ArrayIterator
साथ $myArray->seek(10);
कर सकते हैं।
एक Iterator एक ऐसा ऑब्जेक्ट है जो प्रोग्रामर को एक कंटेनर, विशेष रूप से सूचियों को पार करने में सक्षम बनाता है। कई प्रकार के इटरेटर अक्सर एक कंटेनर इंटरफ़ेस के माध्यम से प्रदान किए जाते हैं।
ArrayObject
और Array
के बीच कोई अंतर नहीं है क्योंकि वे अलग-अलग ऑब्जेक्ट प्रकारों का उपयोग करने के बावजूद वही चीजों का प्रतिनिधित्व करते हैं।
ArrayIterator
एक इटरेटर कि Array-like
वस्तुओं से अधिक दोहराता, यह सभी वस्तुओं है कि ArrayAcess
को लागू करने और देशी Array
प्रकार शामिल है। वास्तव में, जब आप foreach
एक सरणी से अधिक, पीएचपी आंतरिक ArrayIterator
बनाता traversing करते हैं और देखने के लिए अपने कोड को बदलने के रूप में अगर यह आपके द्वारा लिखा गया है,
for($arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator-
>next())
{ $key = $arrayIteartor->key();
$value = $arrayIterator->current();
}
तो आप देख सकते है, हर संग्रह वस्तु के अलावा एक इटरेटर है आपके परिभाषित संग्रह जिन्हें आपको अपने स्वयं के इटरेटर को परिभाषित करने की आवश्यकता है।
क्या आपने [ArrayIterator] (http://www.php.net/ArrayIterator), [ArrayObject] (http://www.php.net/ArrayObject) और [Array] (http: // www। php.net/Array)? शायद आपको वह सारी जानकारी चाहिए जो आपको चाहिए। – vascowhite
इसके अलावा, [स्टैक ओवरफ्लो आपका व्यक्तिगत शोध सहायक नहीं है] (http://meta.stackexchange.com/a/128553/164367) – vascowhite