2011-12-01 15 views
9

यह मेरे पिछले प्रश्नों में से एक को संदर्भित करता है: array_unique vs array_flip - यह बताता है कि array_flip(array_flip())array_unique() से अधिक तेज स्ट्रिंग और पूर्णांक से निपटने पर बहुत तेज़ है।array_unique मूल्यों को क्रमबद्ध क्यों करता है?

मैं क्या पता होना चाहते हैं क्यों array_unique() सरणी एक कॉपी बन जाती, सॉर्ट करता है तो दोनों कार्यों के लिए डुप्लिकेट हटा दिया

स्रोत उपलब्ध here है।

अग्रिम धन्यवाद!

उत्तर

18

यदि आप इसके बारे में एल्गोरिदमिक रूप से सोचते हैं, तो डुप्लिकेट को हटाने का तरीका एक सूची के माध्यम से जाना है, आपको ढूंढने वाली वस्तुओं का ट्रैक रखना है, और उन चीज़ों से छुटकारा पाएं जो पहले से ही "इस" सूची में हैं। इसे पूरा करने का एक आसान तरीका एक सूची को सॉर्ट करना है। इस तरह यह स्पष्ट है कि डुप्लीकेट को कुशलता से हटाया जाए। अपने बारे में सोचो, अकेले कंप्यूटर छोड़ दो; डुप्लीकेट को हटाने के लिए इनमें से कौन सी सूचियां आसान है?

apple 
banana 
cantaloupe 
apple 
durian 
apple 
banana 
cantaloupe 

या

apple 
apple 
apple 
banana 
banana 
cantaloupe 
cantaloupe 
durian 

संपादित करें: इसे में एक सा लग रही है (और this article खोजने) के बाद, यह की तरह दो दोनों मिलता है जबकि काम किया, वे नहीं कार्यात्मक रूप से बराबर कर रहे हैं, लग रहा है या कम से कम वे हमेशा नहीं होते हैं। इन बातों के एक जोड़े की व्याख्या करने के लिए:)

  1. array_unique (मान सॉर्ट करता, जैसा कि आप का उल्लेख किया है, तो array_flip (array_flip()) वापसी होगी नहीं एक ही आदेश दिया सरणी - लेकिन इस वांछित हो सकता है।
  2. यदि मान ऑब्जेक्ट्स हैं, तो आप उन्हें चाबियाँ नहीं बना सकते हैं (दाएं?), यानी फ्लिप विधि सभी सरणी, पर बॉक्स से बाहर नहीं काम करेगी, जबकि वैल्यू विधि मूल्य के बावजूद ठीक काम करती है प्रकार के।
+0

मुझे दस्तावेज को देखने के लिए सहमत होना होगा, सॉर्टिंग के लिए एक वैकल्पिक पैरामीटर है, लगभग एक मृत दे देता है कि वे आंतरिक रूप से सॉर्टिंग के साथ तुलना करते हैं। Array_flip (array_flip()) का उपयोग करके – Tim

+0

आपको सॉर्ट करने की आवश्यकता के बिना अद्वितीय मान देता है। निश्चित रूप से एक बेहतर तरीका होना चाहिए? – Lizard

+1

वैसे यह समझ में आता है, क्योंकि मानों को "squashed" होना होगा क्योंकि कुंजी में डुप्लिकेट नहीं हो सकते हैं। इसके बारे में सोचते हुए, यह ऑपरेशन को ओ (एन) पर छोड़ देगा यदि सरणी के लिए असाइनमेंट निरंतर समय है। अपने प्रश्न का उत्तर देने के लिए, मुझे यकीन नहीं है कि बिल्ट-इन फ़ंक्शन मेरे सिर के ऊपर से क्यों नहीं करता है। –

0

मैं Dan Fego दिया लगता है एक अद्भुत जवाब क्यों एक एक सरणी डुप्लिकेट हटाने से पहले सॉर्ट होता जा सके; हालांकि, मैं ’ डी की जांच करना चाहता हूं कि array_flip() क्या करता है। मैं उदाहरण देकर स्पष्ट करने के लिए निम्न पंक्ति का उपयोग करते हो जाएगा ’:

'a' => 'apple' 
'b' => 'banana' 
'c' => 'apple' 
'd' => 'date' 

array_flip()

'apple' => 'a' 
'banana' => 'b' 
'apple' => 'c' 
'date' => 'd' 

हालांकि उत्पादन कुंजी और मूल्यों exhanges, कुंजी अद्वितीय होना चाहिए। manual बताता है कि कैसे array_flip() इस संभालता है: एक मूल्य के कई घटनाओं है

हैं, तो नवीनतम कुंजी अपने मूल्यों के रूप में इस्तेमाल किया जाएगा, तथा अन्य सभी खो जाएगा।अगर हम array_flip(array_flip()) का उपयोग करने पर हम पाते

'banana' => 'b' 
'apple' => 'c' 
'date' => 'd' 

तो:

'b' => 'banana' 
'c' => 'apple' 
'd' => 'date' 

array_unique() के पीछे प्रेरणा के रूप में, हम केवल जब तक रस्मुस लेर्दोर्फ़ अटकलें कर सकते हैं

तो हम कुछ इस तरह मिल या वर्तमान में PHP विकास पर काम करने वाले किसी व्यक्ति ने जवाब देने की परवाह की है।

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