PHP में एक अरै की की मौजूद है या नहीं, यह निर्धारित करने के लिए जल्दी और बेहतर क्या है?


157

इन 2 उदाहरणों पर विचार करें ...

$key = 'jim';

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

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

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

तो, कौन सा बेहतर है? और तेज? साफ इरादा?


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

4
issetकभी भी बिलकुल ऐसा व्यवहार नहीं करेंगे array_key_exists, कोड उदाहरण जो इसे व्यवहारिक रूप से व्यवहारिक बनाता है यदि कुंजी मौजूद नहीं है तो एक सूचना फेंकता है।
deceze

किस बारे में in_array? maettig.com/1397246220
DanMan

1
@DanMan, यह in_arrayहै O(n)क्योंकि यह मानों की जाँच करता है चाबियाँ नहीं। वे लगभग हमेशा धीमा होने जा रहे हैं जब तक कि आपका nबेहद छोटा न हो।
पचेरियर

क्यों नहीं $array[$key] === null?
पचेरियर

जवाबों:


237

isset()तेज है, लेकिन यह वैसा नहीं है array_key_exists()

array_key_exists()विशुद्ध रूप से जांचता है कि क्या कुंजी मौजूद है, भले ही मान हो NULL

यदि कुंजी मौजूद है और मान है, जबकि isset()वापस आ जाएगी ।falseNULL


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

@ फ्रांसेस्को पासा बस इसके बारे में थोड़ा सोचो। issetएक सरणी खोज फ़ंक्शन नहीं है, यह केवल प्रतीक तालिका में एक चर की उपस्थिति की जाँच करता है और सरणी पर पुनरावृति नहीं करेगा। array_key_existsदूसरी ओर निर्दिष्ट सरणी के पहले आयाम में कुंजियों की खोज / खोज करेंगे।
बारिश

@ मुझे पूरा यकीन है कि array_key_exists()कुंजी सरणी में होने पर ही जांच करेगा, जिसका मतलब है कि यह एक खोज नहीं है क्योंकि यह एक हैश तालिका है।
फ्रांसेस्को पासा

@FrancescoPasa खैर, "कुंजी के लिए खोज" है जो PHP प्रलेखन कहता है। इसके अलावा, मैं यह नहीं बता सकता कि अगर उनके लिए "खोज" का मतलब है कि मेरे लिए इसका मतलब क्या है।
बारिश

32

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

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%

महत्वपूर्ण: arrayKeyExists टाइमिंग को बहुत गलत पाया गया था - यह मान की जाँच नहीं कर रहा था कि कुंजी - 7.1 में संशोधित समय के लिए उस लिंक का अनुसरण करें, जो बहुत बेहतर है। (पहले के php संस्करणों में भी बेहतर होगा, अगर पॉपुलस उस परीक्षण को रीडायरेक्ट करता है।)
टूलमेकरसैट

19

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

एक छोटा बेंचमार्क चलाने से पता चलता है कि isset()यह तेज़ है लेकिन यह पूरी तरह से सही नहीं हो सकता है।


1
क्या आप फिर से अधिक सही के साथ बेंचमार्क चला सकते हैं "(isset ($ array [$ i])) || $ array [$ i] === null)"?
तोमलक

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

1
@Tomalak, मैंने आपके द्वारा सुझाए गए उदाहरण को चलाया, और इसमें कहा गया है कि array_key_exists () isset () से तेज है || ऑपरेटर। codepad.org/5qyvS93x
एलेक्स

1
मृतकों में से ... लेकिन मैंने भी बेंचमार्क को फिर से चलाया, और एक मोड़ बनाया ताकि लूप के लिए दूसरे को खुद के काउंटर को इनिशियलाइज़ करना पड़े और रिजल्ट ऐरे को क्लियर करना पड़े। यह दिखाता है "परेशान है। अशक्त" तेजी से हो रहा है। codepad.org/Np6oPvgS
काइलवैप्पड

3
@ टोमलाक, isset($array[$i]) || $array[$i] === nullइसका कोई मतलब नहीं है क्योंकि यह trueहर मामले के लिए वापस आ जाएगा । isset($array[$i]) || $array[$i] === nullइनपुट्स की परवाह किए बिना आप कभी झूठ नहीं बोलेंगे।
22

10

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

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


मैंने PHP 7 का उपयोग करते हुए एक साधारण बेंचमार्क चलाया है, जो परिणाम दिखाते हैं कि पुनरावृत्ति को पूरा करने में लगने वाला समय है:

$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

मैंने इस कस्टम फ़ंक्शन के परिणामों को इस बेंचमार्क के साथ पूरा करने के लिए जोड़ा है:

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()नगण्य है।


7

Php 7 के साथ Null Coalescing Operator का उपयोग करने की संभावना देता है ।

अशक्त coalescing संचालक (??) isset () के साथ संयोजन में एक ternary का उपयोग करने की जरूरत के सामान्य मामले के लिए वाक्यविन्यास चीनी के रूप में जोड़ा गया है। यदि यह मौजूद है और NULL नहीं है तो यह अपना पहला ऑपरेंड लौटाता है; अन्यथा यह अपना दूसरा ऑपरेंड वापस करता है।

इसलिए अब आप मान के शून्य होने या कुंजी मौजूद न होने की स्थिति में एक डिफ़ॉल्ट मान असाइन कर सकते हैं:

$var = $array[$key] ?? 'default value'

6

php.net से एक अंतर है जिसे आप पढ़ेंगे:

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

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


3

संयोजन 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/


1

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

"मंशा में स्पष्ट" के रूप में: array_key_exists()


3
यदि आप अशक्त व्यवहार के बारे में परवाह नहीं करते हैं तो isset () वास्तव में काफी तेज है (देखें randombenchmark.com/?p=29 )।
मैट कांटोर

0

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

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


-2

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


1
केवल समय $array[$i] === nullनिष्पादित किया जाएगा जब $ i सरणी में मौजूद है और इसका मूल्य NULL है ..
निकल्स लार्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.