J'ai ce tableau multidimensionnel. J'ai besoin de le rechercher et de ne renvoyer que la clé qui correspond à la valeur du "slug". Je sais qu'il existe d'autres discussions sur la recherche de tableaux multidimensionnels, mais je ne comprends pas vraiment assez pour s'appliquer à ma situation. Merci beaucoup pour toute aide!
J'ai donc besoin d'une fonction comme:
myfunction($products,'breville-one-touch-tea-maker-BTM800XL');
// returns 1
Voici le tableau:
$products = array (
1 => array(
'name' => 'The Breville One-Touch Tea Maker',
'slug' => 'breville-one-touch-tea-maker-BTM800XL',
'shortname' => 'The One-Touch Tea Maker',
'listprice' => '299.99',
'price' => '249.99',
'rating' => '9.5',
'reviews' => '81',
'buyurl' => 'http://www.amazon.com/The-Breville-One-Touch-Tea-Maker/dp/B003LNOPSG',
'videoref1' => 'xNb-FOTJY1c',
'videoref2' => 'WAyk-O2B6F8',
'image' => '812BpgHhjBML.jpg',
'related1' => '2',
'related2' => '3',
'related3' => '4',
'bestbuy' => '1',
'quote' => '',
'quoteautor' => 'K. Martino',
),
2 => array(
'name' => 'Breville Variable-Temperature Kettle BKE820XL',
'slug' => 'breville-variable-temperature-kettle-BKE820XL',
'shortname' => 'Variable Temperature Kettle',
'listprice' => '199.99',
'price' => '129.99',
'rating' => '9',
'reviews' => '78',
'buyurl' => 'http://www.amazon.com/Breville-BKE820XL-Variable-Temperature-1-8-Liter-Kettle/dp/B001DYERBK',
'videoref1' => 'oyZWBD83xeE',
'image' => '41y2B8jSKmwL.jpg',
'related1' => '3',
'related2' => '4',
'related3' => '5',
'bestbuy' => '1',
'quote' => '',
'quoteautor' => '',
),
);
php
search
multidimensional-array
key
Ben Kouba
la source
la source
if (myfunction($array, 'field', 'value') !== FALSE )) // do something...
Une autre solution possible est basée sur la
array_search()
fonction. Vous devez utiliser PHP 5.5.0 ou supérieur.Exemple
Explication
La fonction
array_search()
a deux arguments. Le premier est la valeur que vous souhaitez rechercher. Le second est l'endroit où la fonction doit rechercher. La fonctionarray_column()
obtient les valeurs des éléments dont la clé est'uid'
.Résumé
Vous pouvez donc l'utiliser comme:
ou, si vous préférez:
L'exemple original (par xfoxawy) peut être trouvé sur le DOCS .
La
array_column()
page .Mettre à jour
En raison du commentaire de Vael, j'étais curieux, j'ai donc fait un test simple pour mesurer les performances de la méthode qui utilise
array_search
et la méthode proposée sur la réponse acceptée.J'ai créé un tableau qui contenait 1000 tableaux, la structure était comme ça (toutes les données étaient randomisées):
J'ai exécuté le test de recherche 100 fois en recherchant différentes valeurs pour le champ de nom, puis j'ai calculé le temps moyen en millisecondes . Ici vous pouvez voir un exemple.
Les résultats étaient que la méthode proposée pour cette réponse nécessitait environ 2E-7 pour trouver la valeur, tandis que la méthode de réponse acceptée nécessitait environ 8E-7.
Comme je l'ai déjà dit, les deux temps sont assez acceptables pour une application utilisant un tableau de cette taille. Si la taille augmente beaucoup, disons 1M d'éléments, alors cette petite différence sera également augmentée.
Mise à jour II
J'ai ajouté un test pour la méthode basée sur
array_walk_recursive
laquelle était mentionnée certaines des réponses ici. Le résultat obtenu est le bon. Et si nous nous concentrons sur la performance, c'est un peu pire que les autres examinés sur le test . Dans le test, vous pouvez voir que c'est environ 10 fois plus lent que la méthode basée surarray_search
. Encore une fois, ce n'est pas une différence très pertinente pour la plupart des applications.Mise à jour III
Merci à @mickmackusa pour avoir repéré plusieurs limitations sur cette méthode:
la source
array_search()
avecarray_column()
ne fonctionnera pas sur l'exemple de tableau de l'OP car les clés de sous-tableau commencent à partir de1
. Cette méthode échouera également sur les clés associatives. Cette méthode ne fonctionnera que sur des sous-tableaux indexés (à partir de0
et avoir des clés ascendantes consécutives). La raison en est quearray_column()
générera de nouveaux index dans son tableau renvoyé.Cette méthode de classe peut rechercher dans un tableau selon plusieurs conditions:
Produira:
la source
Utilisez cette fonction:
et appelez la fonction.
la source
la source
Pour le prochain visiteur à venir: utilisez la promenade de tableau récursif; il visite chaque "feuille" du tableau multidimensionnel. Voici pour l'inspiration:
la source
Je voudrais faire comme ci-dessous, où
$products
est le tableau réel donné dans le problème au tout début.la source
Essaye ça
la source
&&
et||
au lieu deAND
etOR
dans votre condition. Il n'y a aucune raison de déclarercurrent_key
. La comparaison$needle
doit être stricte.