2011-12-20 1 views
0

Prendre un dictionnaire comme un exemple, disons que j'ai le tableau suivant pour cataloguer les prononciations d'un mot donné:Comment effectuer une recherche de tableau efficace en PHP quand je cherche plus d'une clé dans le tableau?

$pronunciation["text"] = array("alpha", "beta", "gamma", "delta", "epsilon");

$pronunciation["definition"] = array(1, 2, NULL, NULL, 1);

text contient la prononciation qui sera affiché à l'utilisateur, tandis que definition contient l'ID de la définition dans la liste où cette prononciation s'applique. Si definition est NULL, il n'est associé à aucune définition particulière et doit être affiché ailleurs dans l'entrée.

Maintenant, si j'essaie de faire quelque chose comme ce qui suit:

$key = array_search(1, $pronunciation["definition"]);

Tout ce que je vais est 0, puisque c'est la première clé dans definition qui contient la valeur. De même, en remplaçant NULL renvoie 3, mais les deux ont en réalité une autre clé connexe que j'essaie de récupérer.

Existe-t-il un moyen de faire en sorte que toutes les clés associées soient renvoyées sans recourir à des méthodes de force brute telles qu'une boucle for?

Répondre

4

Essayez celui-ci:

array_keys($pronunciation["definition"],1)

+0

Je ne sais pas que 'array_keys' paramètre supplémentaire! –

+0

Vous apprenez quelque chose de nouveau chaque jour .... +1 pour cela @Jauzsika –

+0

^^ Je viens de le découvrir il ya quelques jours :). – Jauzsika

0

Je crains qu'il n'y ait pas une fonction qui fait cela comme vous voulez. Editer: Non, il y a! Voir la réponse de Jauzsika.
Vous devez utiliser une boucle foreach ou une boucle for.

function array_search_all($needle, $haystack) { 
    $keys = array(); 
    foreach ($haystack as $k => $v) if ($v === $needle) $keys[] = $k; 
    return $keys; 
} 

Appel:

$keys = array_search_all(1, $pronunciation["definition"]); 
0

Je ne sais pas wheter il est plus rapide ou pas, mais je pense que s'il sont un ensemble de données que vous devez rechercher, il est préférable de mettre en place un tableau, où les données sont la clé.

$data["alpha"] = 1 
$data["beta"] = 1 
//... 

Toutes vos foreach devrait être modifié de

foreach ($data as $item) { 

à

foreach ($data as $item => $value) { 
0

Restructurer vos tableaux dans un seul tableau calée sur le texte et en utilisant la définition de la valeur:

$pronunciation = array("alpha" => 1, 
         "beta" => 2, 
         "gamma" => NULL, 
         "delta" => NULL, 
         "epsilon" => 1); 

Utilisez ensuite array_filter() pour construire un sous-ensemble des valeurs dont vous avez besoin

$searchVal = 1; 
$subset = array_filter($pronunciation, 
         create_function('$value', 'return $value == '.$searchVal.';') 
        ); 
var_dump($subset); 
Questions connexes