2010-12-02 17 views
9

यदि मैं यह सरणी हैपीएचपी सरणी, एक मूल्य के आधार पर कुंजी प्राप्त

$england = array(
     'AVN' => 'Avon', 
     'BDF' => 'Bedfordshire', 
     'BRK' => 'Berkshire', 
     'BKM' => 'Buckinghamshire', 
     'CAM' => 'Cambridgeshire', 
     'CHS' => 'Cheshire' 
); 

मैं पूरा टेक्स्ट संस्करण से तीन पत्र कोड प्राप्त करने में सक्षम होना चाहता हूँ, मैं कैसे निम्नलिखित समारोह लिखना होगा:

$text_input = 'Cambridgeshire'; 
function get_area_code($text_input){ 
    //cross reference array here 
    //fish out the KEY, in this case 'CAM' 
    return $area_code; 
} 

धन्यवाद!

उत्तर

25

उपयोग array_search():

$key = array_search($value, $array); 

तो, अपने कोड में:

// returns the key or false if the value hasn't been found. 
function get_area_code($text_input) { 
    global $england; 
    return array_search($england, $text_input); 
} 

आप इसे केस संवेदी, तो आप इस समारोह के बजाय array_search() का उपयोग कर सकते हैं करना चाहते हैं:

function array_isearch($haystack, $needle) { 
    foreach($haystack as $key => $val) { 
     if(strcasecmp($val, $needle) === 0) { 
      return $key; 
     } 
    } 
    return false; 
} 

यदि आप सरणी मान नियमित अभिव्यक्ति हैं, तो आप इस फ़ंक्शन का उपयोग कर सकते हैं:

function array_pcresearch($haystack, $needle) { 
    foreach($haystack as $key => $val) { 
     if(preg_match($val, $needle)) { 
      return $key; 
     } 
    } 
    return false; 
} 

इस मामले में आपको यह सुनिश्चित करना होगा कि आपके सरणी में सभी मान वैध नियमित अभिव्यक्ति हैं।

हालांकि, अगर मान एक <input type="select"> से आ रहे हैं, वहाँ एक बेहतर समाधान है: बजाय <option>Cheshire</option> उपयोग <option value="CHS">Cheshire</option>। फिर फॉर्म प्रदर्शित नाम के बजाय निर्दिष्ट मान सबमिट करेगा और आपको अपनी सरणी में कोई भी खोज करने की आवश्यकता नहीं होगी; वैध कोड भेजने के लिए आपको केवल isset($england[$text_input]) की जांच करनी होगी।

+2

+1 @Haroldo बारे में पता होना जब तार के साथ काम है कि array_search केस संवेदी है। – SubniC

+0

क्या array_seach करना संभव है, जहां मान नियमित अभिव्यक्ति है? तो मैं preg_quote और संक्षेप और विभिन्न संस्करणों के लिए खाता का उपयोग कर सकता हूं ... – Haroldo

+0

@ थिफ़ - चुनिंदा इनपुट का उपयोग करने पर उत्कृष्ट सलाह, धन्यवाद! – Haroldo

6

तो $england में सभी मान अद्वितीय हैं, आप कर सकते हैं:

$search = array_flip($england); 
$area_code = $search['Cambridgeshire']; 
+1

वह कोड एक नई सरणी बनाता है जो वर्तमान में iteratinv से निश्चित रूप से कम कुशल है। हालांकि, यह array_search इत्यादि से बेहतर है। आपको कई मानों को सरणी कुंजी के रूप में देखना है-> मूल्य लुकअप सबसे अधिक संभावना हैश मैप का उपयोग करते हैं जबकि मूल्य-> कुंजी लुकअप को पुनरावृत्ति की आवश्यकता होती है। – ThiefMaster

+0

हाँ। पुराने निष्पादन समय बनाम स्मृति खपत संघर्ष फिर से यहाँ है ... –

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