2008-10-29 22 views
23

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

+0

मैं किसी और के लिए के माध्यम से पीसने के लिए इस लिंक छोड़ देंगे, लेकिन आप http://svn.php.net/viewvc/php/php-src पर [PHP के लिए वास्तविक सी स्रोत देख सकते हैं/](http://svn.php.net/viewvc/php/php-src/) –

उत्तर

6

अच्छा, इसके लायक होने के लिए, सभी PHP सरणी एसोसिएटिव सरणी हैं।

2

यह सब हैश टेबल है, विभिन्न वेब मंचों में सूत्रों के अनुसार: http://www.usenet-forums.com/php-language/15348-zend-engine-array-implementation.html

आप सुनिश्चित हो करना चाहते हैं, स्रोत पढ़ा, तो यह संकलन है, लेकिन यह सुनिश्चित कर लें कि आप कर सकते trust your compiler (चेतावनी: पीडीएफ, और असंबंधित, लेकिन बहुत अच्छा)।

+0

लिंक टूटा हुआ है। –

3

@EBGreen सही है।

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

एसोसिएटिव सरणी में मानक dict/हैश प्रदर्शन ओवरहेड होता है।

+3

क्या आप इस बारे में निश्चित हैं? मैंने अभी 1000 प्रविष्टियों की एक टेस्ट सरणी (एक नई सरणी की प्रतिलिपि बनाना, एक करके एक) पर बेंचमार्क चलाए हैं, और यदि आप नई सरणी के लिए कुंजी निर्दिष्ट नहीं करते हैं, तो यह लगातार 7% तेज है (PHP 5.2.6 पर) – JamShady

+0

यह संभव है कि उन्होंने हाल ही में इसे बदल दिया है। जब मैं काम कर रहा था तो मैं 5.1 का उपयोग कर रहा था। जब आप 10k प्रविष्टियों या उससे अधिक के बारे में बात कर रहे हों तो PHP की सरणी AWFUL थी। – jcoby

+2

AFAIK यह मामला नहीं है, कृपया तुलना करें: [एक ज़ेंड हैश तालिका में तत्व 'nNextFreeElement' है ...] (http://stackoverflow.com/questions/3698743/how-to-find-the-next-numeric -इंडेक्स-ऑफ-ए-एक्सचेंज-एरे/3698786 # 3698786) – hakre

7

यह एक हैश तालिका है। प्रकार घोषणा और हैशिंग समारोह यहां हैं:
http://svn.php.net/viewvc/php/php-src/trunk/Zend/zend_hash.h?view=markup

एक हल्के वजन सरणी और spl के भीतर एक लिंक्ड सूची (मानक php lib)

+8

लिंक टूटा हुआ है। – Anthony

+0

स्रोत गिटहब में स्थानांतरित हो गया है: https: // github।com/php/php-src/ब्लॉब/मास्टर/Zend/zend_hash.h – David

4

उच्चतम मतदान जवाब लिंक टूट गया है नहीं है और नहीं देता वह बहुत स्पष्टीकरण।

PHP सी में लिखा गया है और अंतर्निहित संरचना केवल एक सी सरणी है। सी सरणी सिर्फ स्मृति के टुकड़े हैं। सी सरणी में इंडेक्स निरंतर होना चाहिए, आपके पास इंडेक्स 0 और उसके बाद आने वाला इंडेक्स 1000 नहीं हो सकता है। एस सरणी में जोड़े जाने से पहले, सहयोगी सरणी कुंजी को काम करने के लिए, उन्हें हैश फ़ंक्शन के माध्यम से उचित सी इंडेक्स में परिवर्तित कर दिया जाता है।

एक पूर्ण स्पष्टीकरण के लिए, मुझे यह लिंक अधिक जानकारीपूर्ण पाया गया।

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

संबंधित मुद्दे