2010-03-12 16 views
7

की सरणी में मान मौजूद है तो जांचें मेरे पास एक सरणी के भीतर एक सरणी है।php अगर सरणी

$a = array (0 => array ('value' => 'America',), 1 => array ('value' => 'England',),) 

मैं कैसे जांचूं कि 'अमेरिका' सरणी में मौजूद है या नहीं? अमेरिका सरणी कोई भी कुंजी हो सकती है, और वहां कोई भी उपनगर हो सकता है, इसलिए एक सामान्यीकृत समाधान कृपया।

php मैनुअल पर देखकर मैं in_array देखता हूं, लेकिन यह केवल शीर्ष परत के लिए काम करता है। तो in_array("America", $a) जैसे कुछ काम नहीं करेगा।

धन्यवाद।

+1

यदि सभी सरणी में केवल एक मान होता है तो आप उन्हें सरणी में क्यों डाल रहे हैं? उस कुंजी को केवल मूल्य क्यों नहीं दिया गया है? – animuson

+0

क्या स्क्रिप्ट एक बड़ी बहु-आयामी सरणी में केवल एक या शायद तत्वों की एक छोटी मात्रा की तलाश करेगा? या यह कई तत्वों की खोज करेगा जो खोज से पहले सभी तत्वों के एक फ्लैट हैशटेबल/सरणी बनाने के लिए "सस्ता" बना सकते हैं? – VolkerK

+0

क्षमा करें, सरणी में वास्तव में अधिक मूल्य थे, मैंने सवाल के लिए इसे सरल बनाने की कोशिश की, मुझे लगता है कि पीछे हट गया। – Mark

उत्तर

11

एक सामान्य समाधान होगा:

function deep_in_array($needle, $haystack) { 
    if(in_array($needle, $haystack)) { 
     return true; 
    } 
    foreach($haystack as $element) { 
     if(is_array($element) && deep_in_array($needle, $element)) 
      return true; 
    } 
    return false; 
} 

कारण है कि मैं in_arrayऔर उपयोग करने के लिए चुना है एक पाश है: इससे पहले कि मैं सरणी संरचना की गहरी स्तरों की जांच, मुझे यकीन है कि बनाने के लिए, कि खोजा मूल्य वर्तमान स्तर में नहीं है। इस तरह, मुझे आशा है कि कोड किसी प्रकार की गहराई से पहले खोज विधि करने से तेज होगा।


बेशक

अपने सरणी हमेशा 2 आयामी है और आप केवल सरणियों के इस प्रकार में खोज करना चाहते हैं, तो यह तेजी से होता है, तो:

function in_2d_array($needle, $haystack) { 
    foreach($haystack as $element) { 
     if(in_array($needle, $element)) 
      return true; 
    } 
    return false; 
} 
+0

जाने के लिए रास्ता !! –

+0

मुझे लगता है कि 'if (is_array ...) 'के बाद' वापसी 'समस्याग्रस्त है। आप प्रत्येक तत्व के लिए वापसी नहीं कर सकते हैं। इसके बजाय आपको केवल तभी वापस जाना चाहिए जब 'deep_in_array' पर कॉल सही हो। – middus

+0

मेरी सरणी हमेशा दो आयामी है। मुझे प्यार है कि दोनों उत्तरों को फ़ेलिक्स नाम दिया गया है। :) क्या आपका दूसरा विकल्प अन्य फ़ेलिक्स की तुलना में तेज़ है? – Mark

5

पीएचपी एक देशी array_search_recursive() समारोह नहीं है, लेकिन आप एक को परिभाषित कर सकते हैं:

function array_search_recursive($needle, $haystack) { 
    foreach ($haystack as $value) { 
     if (is_array($value) && array_search_recursive($needle, $value)) return true; 
     else if ($value == $needle) return true; 
    } 
    return false; 
} 

अनचाहे लेकिन आपको विचार मिलता है।

+0

हे फ़ेलिक्स;) मेरे से तेज़ हो सकता है क्योंकि आप केवल एक बार सरणी को पार करते हैं। दूसरी ओर आप हमेशा पहले सरणी की जांच करेंगे हालांकि खोज मान मौजूदा सरणी स्तर में पहले से मौजूद हो सकता है। –

0
function search($a,$searchval){ //$a - array; $searchval - search value; 
if(is_array($a)) { 
foreach($a as $val){ 
if(is_array($val)) 
if(in_array($searchval,$val)) return true; 
} 
} 
else return false; 
} 

search($a, 'America'); //function call