2010-06-10 7 views
2

J'ai un tableau en PHP à la suite de la requête suivante à une base de données Wordpress:Comment localiser efficacement des paires clé-valeur dans un tableau PHP multidimensionnel?

SELECT * FROM wp_postmeta WHERE post_id = :id 

Je suis retourné un tableau multidimensionnel qui ressemble à ceci:

Array ([0] => Array ([meta_id] => 380 [post_id] => 72 [meta_key] => _edit_last  [meta_value] => 1) 

... etc.

Quelle est la meilleure façon de trouver une paire clé-valeur particulière dans ce tableau?

Par exemple, comment aurais-je localisé la ligne où [meta_key] = nom_événement afin que je puisse extraire la valeur [meta_value] de cette même ligne dans une variable PHP? Je réalise que je pourrais transformer cela en de nombreuses requêtes MySQL individuelles. Quelqu'un at-il une opinion sur l'efficacité de faire 10 requêtes SQL dans une rangée plutôt que de chercher 10 fois dans le tableau? Je pense que puisque le tableau est en mémoire, ce sera la méthode la plus rapide pour trouver les valeurs dont j'ai besoin.

Ou bien, y a-t-il un meilleur moyen d'interroger la base de données depuis le début afin que mon jeu de résultats soit formaté de manière à faciliter la recherche?

+0

En fait, 'mysql_query()' retourne un MySQL ** ** ressources, pas un tableau. Vous devez utiliser les fonctions MySQL (telles que mysql_fetch_array) pour parcourir les résultats. – animuson

+0

Construisez-vous vous-même le tableau des résultats ou le récupérez-vous simplement à partir d'une fonction Wordpress? –

+0

J'utilise PHP PDO pour interroger afin que je puisse utiliser des paramètres.Je ne suis pas sûr à quoi ressemble le code sous-jacent, mais un appel à pdo-> fetchAll() retourne un tableau multidimensionnel qui est indexé numériquement et associativement. –

Répondre

1

laisse supposer que vous voulez toujours rechercher les colonnes « meta_key » créer le tableau que vous pourriez faire quelque chose comme ceci:

$arr = array(); 
while($row = $mysqli->fetch_assoc()){ 
    $arr[$row['meta_key']] = $row; 
} 

Ensuite, vous aurez un tableau associatif la valeur de « meta_key » comme l'index primaire. Mais dans ce cas, la "meta_key" doit être unique, sinon vous écraseriez les valeurs.

Votre exemple serait de ressembler à ceci:

Array ([_edit_last] => Array ([meta_id] => 380, [post_id] => 72, [meta_key] => _edit_last, [meta_value] => 1) 

Et vous pouvez facilement obtenir le « meta_value » en utilisant l'index:

$var = $arr['_edit_last']['meta_value']; 

Est-ce ce que vous vouliez avoir?

EDIT: Si vous avez plus d'une valeur par "meta_key", vous pouvez également créer un tableau multidimensionnel pour chaque clé. Il suffit d'utiliser cette ligne dans la boucle while au lieu:

$arr[$row['meta_key']][] = $row; 

Vous que d'avoir un tableau pour chaque ligne par « meta_value » de sorte que votre tableau pourrait ressembler à ceci:

Array ([_edit_last] => Array ([0] => Array([meta_id] => 380, [post_id] => 72, [meta_key] => _edit_last, [meta_value] => 1)) 

Vous pouvez alors utiliser une autre boucle pour obtenir toutes les valeurs d'un groupe de valeurs "meta_key".

+0

Aussi Kyle, vous avez raison de dire que la recherche dans le tableau 10 fois est probablement plus rapide que 10 requêtes mysql. Mais ce n'est peut-être pas aussi important que vous le pensez. – Nathan

+0

De mes tests, il n'y a absolument rien de mal à boucler avec 'mysql_fetch_assoc'. L'exécution de requêtes dans une boucle, cependant, est assez lente en comparaison. –

0

Basé sur le tableau que vous avez donné, procédez comme suit:

$multiArray = Array ([0] => Array (['meta_id'] => 380, ['post_id'] => 72, ['meta_key'] => _edit_last, ['meta_value'] => 1); 
$needleKey = 'meta_key'; 
$needle = 'event_name'; 

foreach ($multiArray as $key => $data) { 
    if ($data[$needleKey] == $needle) { 
     echo $key; 
     break; 
    } 
} 
Questions connexes