পিএইচপি-তে একটি অ্যারে কী বিদ্যমান কিনা তা নির্ধারণ করা আরও দ্রুত এবং আরও ভাল কী?


157

এই 2 উদাহরণ বিবেচনা করুন ...

$key = 'jim';

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

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

এগুলির মধ্যে দুটি ভাল কিনা তা জানতে আগ্রহী আমি। আমি সর্বদা প্রথমটি ব্যবহার করেছি তবে অনেক লোক দেখেছি এই সাইটের দ্বিতীয় উদাহরণটি ব্যবহার করা।

সুতরাং, যা ভাল? দ্রুত? পরিষ্কার অভিপ্রায়?


আমি কোনও মানদণ্ড চালাচ্ছি না, নেই। জিজ্ঞাসার আগে আমার থাকা উচিত?
অ্যালেক্স

4
issetকখনই হুবহু আচরণ করবে না array_key_exists, কোড উদাহরণটি অনুমান করে যে এটি অস্তিত্বের সাথে আচরণ করে তা কী উপস্থিত না থাকলে নোটিশ ছুড়ে দেয়।
ছদ্মবেশ


1
@DanMan, in_arrayহয় O(n)কারণ এটি না মান কী পরীক্ষা করে। আপনার nঅত্যন্ত ছোট না হলে এগুলি প্রায় সর্বদা ধীর হতে চলেছে ।
পেসেরিয়র

না কেন $array[$key] === null?
পেসারিয়ার

উত্তর:


237

isset()দ্রুত, তবে এটি এর মতো নয় array_key_exists()

array_key_exists()মানটি থাকলেও কীটি বিদ্যমান কিনা খাঁটি পরীক্ষা করে NULL

যেখানে isset()ফিরে আসবে falseযদি চাবি বিদ্যমান এবং মান NULL


5
আপনার কাছে কি এমন নির্দিষ্ট সংস্থান রয়েছে যা দাবী করে যে আইসেটটি দ্রুত?
ফ্রান্সেস্কো পাসা

@ ফ্রেঞ্চেসো পাসা এটি সম্পর্কে কিছুটা চিন্তা করুন। issetএকটি অ্যারে অনুসন্ধান ফাংশন নয়, এটি কেবল প্রতীক টেবিলের মধ্যে একটি ভেরিয়েবলের উপস্থিতি পরীক্ষা করে এবং অ্যারের মাধ্যমে পুনরাবৃত্তি করবে না। array_key_existsঅন্যদিকে নির্দিষ্ট অ্যারের প্রথম মাত্রায় কীগুলি সন্ধান / পুনরুক্তি করা হবে।
বৃষ্টি

@ রেন আমি নিশ্চিত array_key_exists()যে কীটি অ্যারেটিতে রয়েছে কিনা তা কেবলমাত্র চেক করবেন, যার অর্থ এটি হ্যাশ টেবিল হওয়ায় এটি কোনও অনুসন্ধান করবে না।
ফ্রান্সেস্কো পাসা

@ ফ্রেঞ্চসকোপাসা ওয়েল, "কীগুলির জন্য অনুসন্ধান করুন" পিএইচপি ডকুমেন্টেশন বলে। এগুলি বাদে, আমি তাদের বলতে পারি না যে তাদের কাছে "অনুসন্ধান" করা অর্থ আমার কাছে যা বোঝায় তার থেকে সম্পূর্ণ আলাদা if
বৃষ্টি

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%

গুরুত্বপূর্ণ: অ্যারেকিএজিস্টদের সময় নির্ধারণ করা খুব ভুল বলে আবিষ্কার হয়েছিল - এটি কী নয় মানটি যাচাই করছিল - .1.১-এ সংশোধিত সময়ের জন্য সেই লিঙ্কটি অনুসরণ করুন, যা আরও ভাল। (পূর্ববর্তী পিএইচপি সংস্করণগুলিতে আরও ভাল হতে পারে, যদি পপুলাস সেই পরীক্ষাটি পুনরায় পাঠিয়ে দেয়))
টুলমেকারস্টিভ

19

ওয়েল, মূল পার্থক্য হল isset()ফিরবে না trueঅ্যারের কী যে একটি নাল মান মিলা, যখন array_key_exists()আছে।

একটি ছোট বেঞ্চমার্ক চালানো দেখায় যে isset()এটি দ্রুততর তবে এটি সম্পূর্ণ সঠিক নাও হতে পারে।


1
আপনি আরও সঠিক "(isset ($ অ্যারে [$ i]) || $ অ্যারে [$ i] === নাল)" দিয়ে আবার মাপদণ্ড চালাতে পারেন?
টমলাক

ওহ, এবং আপনি কোনও ইঙ্গিত পোস্ট করবেন যে দুটি রূপের পারফরম্যান্সের পারফরম্যান্স কতটা? ধন্যবাদ!
তোমালাক

1
@ তোমালাক, আমি আপনার প্রস্তাবিত উদাহরণটি চালিয়েছি এবং এতে বলা হয়েছে যে অ্যারে_কি_এক্সিজিস্ট () ইস্টের সাথে () এর চেয়ে দ্রুত (||) অপারেটর. codepad.org/5qyvS93x
অ্যালেক্স

1
মৃতদের থেকে উপরে ... তবে আমি আবারও বেঞ্চমার্কটি পুনরায় চালিয়েছি এবং একটি ঝাপটা তৈরি করেছি যাতে লুপের জন্য দ্বিতীয়টি তার নিজস্ব কাউন্টার শুরু করতে হয় এবং ফলাফলের অ্যারে সাফ করতে হয়। এটি "ইসসেট || নাল" দ্রুত হওয়া দেখায়। codepad.org/Np6oPvgS
KyleWpppd

3
@ তোমালাক, isset($array[$i]) || $array[$i] === nullকোনও অর্থবোধ করে না কারণ এটি trueপ্রতিটি ক্ষেত্রেই ফিরে আসবে । isset($array[$i]) || $array[$i] === nullইনপুট নির্বিশেষে আপনি কখনই ভুল পাবেন না ।
পেসারিয়ার

10

আমি এই প্রশ্নের জন্য আমার 2 সেন্ট যুক্ত করতে চেয়েছিলাম, যেহেতু আমি মধ্যম পথটি মিস করছি।

বলেছি হিসাবে isset()তাই এটি ফিরে আসবে কী এর মান মূল্যায়ন করবে falseযদি মান nullযেখানে array_key_exists()শুধুমাত্র চেক করবে কী অ্যারের মধ্যে যদি উপস্থিত থাকে।


আমি পিএইচপি 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

পিএইচপি 7 সহ নাল কোলেসিং অপারেটর ব্যবহারের সম্ভাবনা দেয় ।

নাল কোয়েলেসিং অপারেটর (??) সিনেট্যাকটিক চিনির হিসাবে যুক্ত করা হয়েছে আইসেট () এর সাথে একত্রে একটি টার্নারি ব্যবহার করার প্রয়োজনের সাধারণ ক্ষেত্রে। এটি উপস্থিত থাকলে এটি প্রথম অপারেন্ডটি ফেরত দেয় এবং শূন্য নয়; অন্যথায় এটি তার দ্বিতীয় অপারেন্ড ফেরত দেয়।

সুতরাং এখন মানটি শূন্য হলে বা কীটি উপস্থিত না থাকলে ক্ষেত্রে আপনি একটি ডিফল্ট মান নির্ধারণ করতে পারেন:

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

6

আপনি পড়বেন পিএইচপিএন থেকে একটি পার্থক্য রয়েছে :

isset () অ্যারের কীগুলির জন্য সত্য ফেরায় না যা NUL মানের সাথে মিলে যায়, যখন অ্যারে_কি_এক্সেস্ট () করে।

একটি খুব অনানুষ্ঠানিক পরীক্ষা 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-eferences-existance-in-an-array/


1

"দ্রুত" হিসাবে: এটি চেষ্টা করুন (আমার অর্থ চালু আছে array_key_exists(), তবে আমি এখনই এটি চেষ্টা করতে পারি না)।

"উদ্দেশ্য আরও পরিষ্কার" হিসাবে: array_key_exists()


3
যদি আপনি নাল আচরণের বিষয়ে যত্ন না রাখেন ( এলোমেলোমার্কমার্কস / ? p=29 দেখুন ) isset () আসলে তাত্পর্যপূর্ণভাবে দ্রুত ।
ম্যাট ক্যান্টর

0

স্পষ্টতই দ্বিতীয় উদাহরণটি পরিষ্কারভাবে পরিষ্কার, এটি সম্পর্কে কোনও প্রশ্ন নেই। # 1 কী উদাহরণ দেয় তা নির্ধারণ করার জন্য, আপনাকে পিএইচপি-র পরিবর্তনশীল সূচনা আইডিসিএনক্র্যাসিগুলির সাথে পরিচিত হওয়া দরকার - এবং তারপরে আপনি খুঁজে পাবেন যে এটি নাল মানগুলির জন্য আলাদাভাবে কাজ করে এবং আরও অনেক কিছু।

কোনটি দ্রুত - আমি অনুমান করার ইচ্ছা করি না - আপনার পিএইচপি সংস্করণে কয়েক লক্ষ হাজার বার টাইট লুপে চালাও এবং আপনি খুঁজে পাবেন :)


-2

আপনার কোডটি, isset($array[$i]) || $array[$i] === nullকীটি উপস্থিত না থাকলেও, এবং প্রতিটি ক্ষেত্রে সত্যই ফিরে আসবে (এবং একটি অনির্ধারিত সূচক বিজ্ঞপ্তি দেয়)। সেরা পারফরম্যান্সের জন্য আপনি যা চান তা হ'লif (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}


1
একমাত্র সময় $array[$i] === nullকার্যকর করা হবে যখন $ আমি অ্যারেতে উপস্থিত
থাকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.