कई आयामी सरणियों में रैखिक खोज एल्गोरिदम (उपरोक्त रैखिक हैं) से सावधान रहें क्योंकि उनके पास जटिल जटिलता है क्योंकि इसकी गहराई पूरे सरणी को पार करने के लिए आवश्यक पुनरावृत्तियों की संख्या को बढ़ाती है। उदाहरण के लिए:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
एक उपयुक्त एल्गोरिथ्म के साथ (यदि सुई [100] [1] पर थी), तो आप जो ढूंढ रहे हैं, उसे खोजने के लिए सबसे अधिक 200 पुनरावृत्तियों पर ध्यान देना होगा।
इस मामले में रैखिक एल्गोरिदम ओ (एन) पर प्रदर्शन करते हैं (पूरे सरणी में तत्वों की कुल संख्या), यह खराब है, एक लाख प्रविष्टियां (उदाहरण के लिए एक 1000x100x10 सरणी) सुई खोजने के लिए औसतन 500,000 पुनरावृत्तियों को ले जाएगा। इसके अलावा क्या होगा यदि आपने अपने बहुआयामी सरणी की संरचना को बदलने का फैसला किया है? और अगर आपकी गहराई 100 से अधिक थी, तो PHP एक पुनरावर्ती एल्गोरिथ्म को बाहर निकाल देगा। कंप्यूटर विज्ञान बेहतर कर सकता है:
जहां संभव हो, हमेशा कई आयामी सरणियों के बजाय वस्तुओं का उपयोग करें:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
और उन्हें खोजने और खोजने के लिए एक कस्टम तुलनित्र इंटरफ़ेस और फ़ंक्शन लागू करें:
interface Comparable {
public function compareTo(Comparable $o);
}
class MyObject implements Comparable {
public function compareTo(Comparable $o){
...
}
}
function myComp(Comparable $a, Comparable $b){
return $a->compareTo($b);
}
आप uasort()
एक कस्टम तुलनित्र का उपयोग करने के लिए उपयोग कर सकते हैं , यदि आप साहसी महसूस कर रहे हैं तो आपको अपनी वस्तुओं के लिए अपने स्वयं के संग्रह को लागू करना चाहिए जो उन्हें सॉर्ट और प्रबंधित कर सकते हैं (मैं बहुत कम से कम खोज फ़ंक्शन को शामिल करने के लिए ArrayObject का विस्तार करता हूं)।
$arrayObj->uasort("myComp");
एक बार जब उन्हें सॉर्ट किया जाता है (uasort O (n लॉग एन), जो कि मनमाने ढंग से डेटा मिलने पर उतना ही अच्छा होता है), बाइनरी सर्च ओ (लॉग एन) समय में ऑपरेशन कर सकता है, यानी एक मिलियन एंट्रीज़ में केवल ~ 20 पुनरावृत्तियों को लेना है खोज। जहाँ तक मुझे पता है कि कस्टम तुलनित्र बाइनरी खोज PHP में लागू नहीं है (array_search()
प्राकृतिक ऑर्डरिंग का उपयोग करता है जो ऑब्जेक्ट के संदर्भ में काम करता है न कि उनके गुण), आपको इसे अपने स्वयं को लागू करना होगा जैसे मैं करता हूं।
यह दृष्टिकोण अधिक कुशल है (अब कोई गहराई नहीं है) और अधिक महत्वपूर्ण रूप से सार्वभौमिक (मान लेते हैं कि आप इंटरफेस का उपयोग करते हुए तुलनीयता लागू करते हैं) क्योंकि ऑब्जेक्ट परिभाषित करते हैं कि वे कैसे सॉर्ट किए जाते हैं, इसलिए आप कोड को असीम रूप से पुन: चक्रित कर सकते हैं। बहुत बेहतर =)
$key
सरणी में मौजूद नहीं है, तो "कुशल" उत्तर त्रुटि न करें? ऐसा करना बेहतर नहीं होगाif (array_key_exists($key, $array) && $array[$key] == $value) {
?