2010-12-02 4 views
9

Если у меня есть этот массивPHP массива, получить ключ на основе значения

$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 2010-12-02 11:50:28

+0

Можно ли сделать array_seach, где значение является регулярным выражением? Тогда я мог бы использовать preg_quote и учитывать аббревиатуры и разные версии и ... – Haroldo 2010-12-02 11:54:51

6

Если все значения в $england уникальны, вы можете сделать:

$search = array_flip($england); 
$area_code = $search['Cambridgeshire']; 
Смежные вопросы