2013-02-10 7 views
12
$array = array(1, '1a', '1'); 
var_export(array_unique($array, SORT_REGULAR)); 
  • परिणाम: सरणी (0 => 1, 2 => '1')
  • पीएचपी मैनुअल में: SORT_REGULAR - आइटम सामान्य रूप से तुलना (प्रकार परिवर्तित नहीं है)।

इसके पीछे तर्क क्या है? क्यों '1 ए' को बाहर रखा गया है या कैसे?Array_unique SORT_REGULAR झंडा

उत्तर

13

यह इसलिए होता है क्योंकि क्रमबद्ध सरणी पर और परिणाम सब लगातार मूल्यों है कि यह के बराबर की तुलना से छोड़कर प्रत्येक मान के लिए द्वारा first sorting the values as strings, तो iteratingarray_unique काम करता है।

उपरोक्त तुलनात्मक "बराबर" के लिए तुलनात्मक कार्य दूसरे पैरामीटर के अनुसार चुना गया है, जो SORT_REGULAR== के साथ समानता जांच के समान है।

यह व्यवहार पूरी तरह से गॉथस को जन्म देता है। चूंकि सॉर्ट क्विकॉर्ट है, यह अस्थिर है। इसलिए 1 और '1' दोनों में एक सरणी सॉर्ट करना कोई गारंटी नहीं देता है कि परिणाम में पहला कौन सा होगा। इसका मतलब है कि कुछ मामलों में array_unique कुछ मामलों में 1 मनमाने ढंग से "पसंद" और '1' दिखाई दे सकता है।

जारी है हालांकि पागलपन: विचार है कि यदि प्रकार का उत्पादन [1, '1', '1a'] तो '1a'नहीं परिणाम में शामिल किया जाएगा, जबकि अगर तरह का उत्पादन ['1', 1, '1a'] तो यह शामिल किया जाएगा (यह होता है (यह 1 के बराबर तुलना) स्ट्रिंग '1' के बराबर तुलना नहीं करें)!

+0

क्या यह पुनरावृत्ति केवल एक बार होता है? क्योंकि तब हमें डुप्लिकेट मान प्राप्त करना चाहिए यदि '5' –

+0

@OneTrickPony के बाद कोई अन्य' 1' शामिल किया गया है: मैंने स्पष्ट रूप से उल्लेख नहीं किया है कि सरणी पहले क्रमबद्ध है (दस्तावेज़ीकरण करता है)। लेकिन दूसरे विचार पर यह काफी महत्वपूर्ण है क्योंकि क्रम स्थिर नहीं है (quicksort), तो मुझे थोड़ा सा जवाब विस्तारित करने दें। – Jon

+0

@OneTrickPony: असल में यह मेरे विश्वास से थोड़ा अलग काम करता है - और शायद आपको यह जानकर आश्चर्य नहीं होगा कि इस तरह के मामलों में व्यवहार की भविष्यवाणी नहीं की जा सकती है, ठीक है, PHP। – Jon

4

यदि आप थोड़ा और तकनीकी प्राप्त करना चाहते हैं, तो आप स्रोत देख सकते हैं।

PHP_SORT_REGULAR ध्वज मानक तुलना ऑपरेटर (==) पर वापस आने के लिए बस array_unique बताता है।

आप array_unique के लिए स्रोत है जो php_set_compare_func का उपयोग करता है में देख सकते हैं:

static void php_set_compare_func(int sort_type TSRMLS_DC) /* {{{ */ 
{ 
switch (sort_type & ~PHP_SORT_FLAG_CASE) { 
... 
    case PHP_SORT_REGULAR: 
    default: 
     ARRAYG(compare_func) = compare_function; 
     break; 
} 

कहाँ compare_func सिर्फ standard comparison function है।

शायद यह किसी अन्य चीज़ की तुलना में एक दस्तावेज़ीकरण बग है।

... बराबर यदि और केवल यदि (स्ट्रिंग) $ elem1 === (स्ट्रिंग) $ elem2

दोनों मूल्यों स्ट्रिंग के साथ ढाले रहे हैं: दस्तावेज में टिप्पणी कुछ भ्रामक है , तो === अनावश्यक है, लेकिन यह धारणा की ओर जाता है कि SORT_REGULAR एक प्रकार की तुलना करता है।

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