2009-03-31 9 views
116

इन 2 उदाहरणों को देखें ...PHP में एक सरणी कुंजी मौजूद है या नहीं, यह निर्धारित करने के लिए तेज़ और बेहतर क्या है?

$key = 'jim'; 

// example 1 
if (isset($array[$key])) { 
    // ... 
} 

// example 2  
if (array_key_exists($key, $array)) { 
    // ... 
} 

मैं जानने में दिलचस्पी रहा हूँ अगर इनमें से किसी बेहतर हैं। मैंने हमेशा पहले उपयोग किया है, लेकिन देखा है कि बहुत से लोग इस साइट पर दूसरे उदाहरण का उपयोग करते हैं।

तो, कौन सा बेहतर है? और तेज? स्पष्ट इरादा?

+1

क्या आपने वास्तव में * कोशिश की * जो तेज है? – Tomalak

+0

मैंने कोई बेंचमार्क नहीं चलाया है, नहीं। क्या मुझे पूछने से पहले चाहिए? – alex

+4

'isset' कभी भी 'array_key_exists' की तरह व्यवहार नहीं करेगा, कोड उदाहरण जो माना जाता है कि यह व्यवहार करता है, यदि कुंजी मौजूद नहीं है तो नोटिस फेंक देता है। – deceze

उत्तर

157

isset() तेजी से होता है हो सकता है, लेकिन यह array_key_exists() के रूप में ही नहीं है।

array_key_exists() पूरी तरह से जांचता है कि कुंजी मौजूद है, भले ही मान NULL है।

जबकि isset()false वापस आ जाएगी, तो कुंजी मौजूद हैं और मूल्य NULL है।

+0

क्या आपके पास विशिष्ट संसाधनों का दावा है कि जारीकर्ता तेजी से है? –

+0

मुझे एक महत्वपूर्ण मार्जिन (20-50%) द्वारा 'जारी करने' (''' होने के लिए तेज़ 'वैकल्पिक' भी मिला। Http://juliusbeckmann.de/blog/php-benchmark-isset-or-array_key_exists.html, http://www.php.net/manual/en/function.array-key-exists.php#82867 या http देखें : //www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/। यह ध्यान दिया जाना चाहिए कि अगर कुंजी मौजूद है तो जारीकर्ता() झूठी रिटर्न देता है लेकिन मान शून्य है। –

1

"तेज़" के रूप में: इसे आज़माएं (मेरा पैसा array_key_exists() पर है, लेकिन मैं अभी इसे आजमा नहीं सकता)।

"आशय में स्पष्ट करने के लिए" के रूप में: array_key_exists()

+3

जारीकर्ता() वास्तव में काफी तेज़ है यदि आपको शून्य व्यवहार की परवाह नहीं है (देखें http://www.randombenchmarks.com/?p=29)। –

5

वहाँ php.net से एक फर्क .. आप पढ़ेंगे है:

isset() सरणी कुंजी है कि अनुरूप के लिए सही वापस नहीं करता है एक पूर्ण मान के लिए, जबकि array_key_exists() करता है।

एक बहुत ही अनौपचारिक परीक्षण से पता चलता array_key_exists() लगभग 2.5 गुना isset की तुलना में धीमी()

16

अच्छा, मुख्य अंतर यह है कि isset()true वापस शून्य कुंजी के अनुरूप सरणी कुंजियों के लिए नहीं लौटाएगा, जबकि array_key_exists() करता है।

small benchmark चलाने से पता चलता है कि isset() यह तेज़ है लेकिन यह पूरी तरह से सटीक नहीं हो सकता है।

+1

क्या आप फिर से अधिक सही के साथ बेंचमार्क चला सकते हैं "(जारीकर्ता ($ सरणी [$ i]) || $ सरणी [$ i] === शून्य)"? – Tomalak

+0

ओह, और क्या आप एक संकेत पोस्ट करेंगे कि दो प्रकार के प्रदर्शन में कितना प्रदर्शन अंतर दिखता है? धन्यवाद! – Tomalak

+0

क्या आपने '$ arraykeyexists_result []' लाइनों को छोड़ने पर विचार किया था? यह इस मामले में अप्रासंगिक है। – Gumbo

0

स्पष्ट रूप से दूसरा उदाहरण इरादे से स्पष्ट है, इसके बारे में कोई सवाल नहीं है। यह पता लगाने के लिए कि कौन सा उदाहरण # 1 करता है, आपको PHP की चर प्रारंभिक idiosyncracies से परिचित होना चाहिए - और फिर आप पाएंगे कि यह शून्य मानों के लिए अलग-अलग कार्य करता है, और इसी तरह।

के रूप में करने के लिए है जो तेजी से - मैं अटकलें नहीं लगाना चाहते हैं - चलाने के लिए या तो एक तंग पाश में अपने PHP संस्करण पर कुछ सौ हजार गुना और आपको पता चल जाएगा :)

-1

आपका कोड, isset($array[$i]) || $array[$i] === null, प्रत्येक मामले में सत्य वापस आ जाएगा, भले ही कुंजी मौजूद न हो (और एक अपरिभाषित इंडेक्स नोटिस उत्पन्न करें)।के लिए सर्वश्रेष्ठ प्रदर्शन आप क्या चाहते हैं if (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}

+0

यह http://stackoverflow.com/a/700264/632951 – Pacerier

+0

पर टोमालक की टिप्पणी का उत्तर है, केवल एक ही समय '$ सरणी [$ i] === null' निष्पादित किया जाएगा जब $ सरणी में मौजूद है और मूल्य शून्य है .. –

21

है मैं हाल ही में किया है आप कुछ परीक्षण में रुचि रखते हैं:

https://stackoverflow.com/a/21759158/520857

सारांश:

| Method Name        | Run time    | Difference 
========================================================================================= 
| NonExistant::noCheckingTest()   | 0.86004090309143  | +18491.315775911% 
| NonExistant::emptyTest()     | 0.0046701431274414 | +0.95346080503016% 
| NonExistant::isnullTest()    | 0.88424181938171  | +19014.461681183% 
| NonExistant::issetTest()     | 0.0046260356903076 | Fastest 
| NonExistant::arrayKeyExistsTest()  | 1.9001779556274  | +209.73055713% 
2

isset() और is_null() का मेल अन्य कार्यों के खिलाफ सर्वश्रेष्ठ प्रदर्शन दें: array_key_exists(), isset(), isset() + array_key_exists(), is_null(), isset() + is_null(), यहां एकमात्र मुद्दा यह है कि फ़ंक्शन न केवल झूठी वापसी करेगा यदि कुंजी मौजूद नहीं है, लेकिन यहां तक ​​कि कुंजी मौजूद है और इसका शून्य मान है।

बेंचमार्क स्क्रिप्ट:

<?php 
    $a = array('a' => 4, 'e' => null) 

    $s = microtime(true); 
    for($i=0; $i<=100000; $i++) { 
    $t = (isset($a['a'])) && (is_null($a['a'])); //true 
    $t = (isset($a['f'])) && (is_null($a['f'])); //false 
    $t = (isset($a['e'])) && (is_null($a['e']));; //false 
    } 

    $e = microtime(true); 
    echo 'isset() + is_null() : ' , ($e-$s)."<br><br>"; 
?> 

क्रेडिट: http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/

5

मैं इस सवाल पर मेरी 2 सेंट जोड़ने के लिए, के बाद से मैं एक मध्यम मार्ग बाहर याद आ रही थी चाहता था।

जैसा कि पहले ही कहा था कि isset() तो यह false वापस आ जाएगी कि अगर मूल्य null जहां array_key_exists() केवल जाँच करेगा कुंजी सरणी में मौजूद रहने पर है कुंजी के मान का मूल्यांकन करेंगे।

$a = [null, true]; 

isset($a[0])       # 0.3258841 - false 
isset($a[1])       # 0.28261614 - true 
isset($a[2])       # 0.26198816 - false 

array_key_exists(0, $a)     # 0.46202087 - true 
array_key_exists(1, $a)     # 0.43063688 - true 
array_key_exists(2, $a)     # 0.37593913 - false 

isset($a[0]) || array_key_exists(0, $a) # 0.66342998 - true 
isset($a[1]) || array_key_exists(1, $a) # 0.28389215 - true 
isset($a[2]) || array_key_exists(2, $a) # 0.55677581 - false 

array_key_isset(0, $a)     # 1.17933798 - true 
array_key_isset(1, $a)     # 0.70253706 - true 
array_key_isset(2, $a)     # 1.01110005 - false 

मैं इस के साथ इस कस्टम समारोह से परिणाम जोड़ दिया है:


मैं PHP 7 का उपयोग कर एक सरल बेंचमार्क दौड़ा दिया है, दिखाए गए परिणामों समय यह यात्रा समाप्त करने के लिए ले लिया है बेंचमार्क पूरा करने के लिए और साथ ही:

function array_key_isset($k, $a){ 
    return isset($a[$k]) || array_key_exists($k, $a); 
} 

के रूप में देखा जाता है और पहले से ही बताया isset() एफएएस है परीक्षण विधि लेकिन यदि मान null है तो यह झूठी वापसी कर सकता है। यह अवांछित परिणाम दे सकता है और यदि ऐसा है तो आमतौर पर array_key_exists() का उपयोग करना चाहिए।

हालांकि एक मध्यम तरीका है और यह isset() || array_key_exists() का उपयोग कर रहा है। इस कोड को आम तौर पर तेजी समारोह isset() और अगरisset() रिटर्न झूठी उसके बाद ही उपयोग array_key_exists() मान्य करने के लिए उपयोग कर रहा है। ऊपर की तालिका में दिखाया गया है, यह स्पष्ट रूप से isset() पर कॉल करने के रूप में तेज़ है।

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

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

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