2010-12-02 3 views
9

Si j'ai ce tableauArray PHP, obtenir la clé basée sur une valeur

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

Je veux être en mesure d'obtenir le code à trois lettres de la version en texte intégral, comment pourrais-je écrire la fonction suivante:

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

merci!

Répondre

25

Utilisation array_search():

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

Donc, dans votre code:

// 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); 
} 

Si vous voulez insensible à la casse, vous pouvez utiliser cette fonction au lieu de array_search():

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

Si les valeurs du tableau sont des expressions régulières, vous pouvez utiliser cette fonction:

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

Dans ce cas, vous devez vous assurer que toutes les valeurs de votre tableau sont des expressions régulières valides.

Cependant, si les valeurs proviennent d'un <input type="select">, il y a une meilleure solution: Au lieu de <option>Cheshire</option> utilisation <option value="CHS">Cheshire</option>. Ensuite, le formulaire soumettra la valeur spécifiée au lieu du nom affiché et vous n'aurez pas à faire de recherche dans votre tableau; il vous suffit de vérifier isset($england[$text_input]) pour vous assurer qu'un code valide a bien été envoyé.

+2

+1 @Haroldo être conscient que array_search est sensible à la casse lorsque vous travaillez avec des chaînes. – SubniC

+0

Est-il possible de faire array_seach, où la valeur est une expression régulière? Ensuite, je pourrais utiliser preg_quote et compte pour les abréviations et les différentes versions de et ... – Haroldo

+0

@Thief - excellent conseil sur l'utilisation de l'entrée de sélection, merci! – Haroldo

6

Si toutes les valeurs $england sont uniques, vous pouvez le faire:

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

Ce code crée un nouveau tableau qui est certainement moins efficace que iteratinv sur un existant. Cependant, il vaut mieux que array_search etc. vous devez rechercher beaucoup de valeurs car les recherches de type clé de table> valeur utilisent probablement une carte de hachage tandis que les recherches de valeur-> clé nécessitent une itération. – ThiefMaster

+0

Ouais. Voici l'ancien temps d'exécution vs conflit de consommation de mémoire à nouveau ... –

Questions connexes