2011-03-16 8 views
8

जब एक अनुक्रमित सरणीपीएचपी एक एसोसिएटिव सरणी में ऑर्डर का ट्रैक कैसे रखता है?

$array[] = 'new value'; 

पर एक नया मान धक्का पीएचपी प्रलेखन बताते हैं कि यह कैसे [MAX_INDEX + 1] की स्थिति में जोड़ा जाता है।

जब एक साहचर्य सरणी

$array['key'] = 'new value'; 

यह एक ही काम करता है, लेकिन मैं दस्तावेज में कोई स्पष्टीकरण नहीं दिख रहा है इस बात की पुष्टि करने के लिए कैसे या क्यों यह ऐसा नहीं करता है पर एक नया मान धक्का। यह आदेश मेरे कार्यान्वयन में सुसंगत प्रतीत होता है, लेकिन मुझे यह सुनिश्चित करने के लिए कैसे पता चलेगा कि आदेश वही रहेगा? क्या किसी को पता है कि बैक एंड पर PHP कैसे लागू करता है?

+2

मेरा मानना ​​है कि कार्यान्वयन विवरण [zend_hash.c] (में http://svn.php.net/viewvc/php/php पाया जा सकता है "सब कुछ एक HashTable है" -src/ट्रंक/Zend/zend_hash.c? दृश्य = मार्कअप)। मुझे लगता है कि इंडेक्स अलग रखा गया है, और '-> PInternalPointer' अंतिम दिखाता है। – mario

+1

वे शायद सिर्फ लिंक किए गए हैश मैप्स हैं। लिंकिंग हैशिंग के बावजूद आदेश प्रदान करता है। –

+0

महान जवाब! मुझे इसकी ही खोज थी! :-) –

उत्तर

0

How are associative arrays implemented in PHP? आपको कुछ अंतर्दृष्टि दे सकता है।

ऐसा लगता है कि PHP सरणी अनिवार्य रूप से हैश टेबल हैं, इसलिए सरणी का क्रम तब तक रहेगा जब तक आप इसे पुन: व्यवस्थित नहीं करते (उदा। सरणी को सॉर्ट करके)।

संपादित करें: यह इस downvoted हो रही है प्रकट होता है, की अनुमति देने के लिए मुझे स्पष्ट रूप से स्रोतों मैं यहाँ नीचे टिप्पणी में से जुड़ा हुआ शामिल करने के लिए ...

  • "पीएचपी साहचर्य सरणियों वास्तव में के एक कार्यान्वयन कर रहे हैं hashtables ", से How is the PHP array implemented on the C level?

  • इसके अलावा उस स्रोत से

    :" पीएचपी सरणी एक श्रृंखलित हैश तालिका (ओ (ग) और हे (एन) प्रमुख टकराव पर की देखने) कि पूर्णांक और स्ट्रिंग चाबी के लिए अनुमति देता है यह। दो टाइप फिट करने के लिए 2 अलग हैशिंग एल्गोरिदम का उपयोग करता है एक ही हैश कुंजी अंतरिक्ष में es। "

  • से http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html

+6

necromancy के लिए खेद है, लेकिन इस जवाब को कोई मतलब नहीं है। यदि यह एक साधारण हैश तालिका थी, प्रविष्टियों का क्रम प्रत्येक कुंजी के हैश मान पर आधारित होना चाहिए, प्रविष्टियों के अनुक्रम पर नहीं। असल में, इस तरह हैश टेबल किसी भी अन्य भाषा में व्यवहार करते हैं। और फिर भी PHP सहयोगी सरणी सम्मिलन के अनुक्रम का ट्रैक रखने लगते हैं। तो सवाल अभी भी मेरे लिए खुला है। इससे ऐसा कैसे होता है? क्या इस पर भरोसा किया जा सकता है? – Tobia

+0

http://stackoverflow.com/questions/2350361/how-is-the-php-array-implemented-on-the-c-level – n00dle

+0

http://nikic.github.io/2012/03/28/ अंतर्दृष्टि -PHPs-आंतरिक-सरणी-implementation.html – n00dle

2

MAX_INDEX वास्तव में आदेश देने के लिए कुछ भी नहीं है।
आप

$array[5] = 'new value'; 
$array[1] = 'new value'; 
$array[105] = 'new value'; 
$array[2] = 'new value'; 

और सरणी है कि आदेश के साथ-साथ रखेंगे कर सकते हैं।

PHP सरणी एक आदेश दिया गया मानचित्र है, इसलिए, यह नक्शा है जो इसका ऑर्डर रखता है।
सरणी तत्व केवल तब से ऑर्डर रखता है जब वे जोड़े गए थे (या इसे पूरी तरह से कुछ सरणी मैनिपुलेशन फ़ंक्शन द्वारा संशोधित किया गया था)।
यह सब कुछ है।

0

मैं ksort पर भरोसा करना पसंद करता हूं। मेरे अनुभव में, जब तक आप तत्वों को हटाने शुरू नहीं करते हैं, तब तक सरणी स्थिर रहती हैं। मैन्युअल रूप से उन्हें सॉर्ट करने के लिए बेहतर है और पता है कि वे आपके इच्छित क्रम में हैं।

+0

तत्वों को हटाने में क्या गड़बड़ है? –

+0

मुझे तत्वों को हटाने और सरणी को सॉर्ट करने में परेशानी हो रही है।शायद मेरे हिस्से पर शायद खराब प्रोग्रामिंग, लेकिन अगर मैं उस पर भरोसा कर रहा हूं तो सरणी के आदेश को हमेशा परिभाषित करने की मेरी आदत का नेतृत्व किया। – Ryre