Trouver la valeur la plus élevée dans le tableau multidimensionnel
Le Problème
J'ai un tableau multidimensionnel similaire à celui ci-dessous. Ce que je suis en train de réaliser est une façon de trouver et de récupérer à partir de la matrice de celui avec le plus de "Total" de la valeur, et maintenant que je sais qu'il y a une fonction appelée max
mais cela ne fonctionne pas avec un tableau multidimensionnel de ce genre.
Ce que j'ai pensé à faire est de créer une boucle foreach et la construction d'un nouveau tableau avec seulement les totaux, puis à l'aide max
pour trouver la valeur max, qui serait le seul enjeu serait alors de récupérer le reste des données qui le concerne que la valeur max. Je ne suis pas sûr que c'est le moyen le plus efficace soit.
Des idées?
Array
(
[0] => Array
(
[Key1] => Key1
[Total] => 13
)
[1] => Array
(
[Key2] => Key2
[Total] => 117
)
[2] => Array
(
[Key3] => Key3
[Total] => 39
)
)
- Si vous n'avez pas besoin d'une telle performance - deux boucles seront bonnes. Si vous voulez énorme gain de performance dans les matrices avec vraiment beaucoup d'éléments, vous devriez utiliser l'Intervalle des Arbres(Segment des Arbres) pour stocker des valeurs. Mais c'est un énorme théorie et peut ne pas être nécessaire dans votre cas.
Vous devez vous connecter pour publier un commentaire.
Depuis PHP 5.5, vous pouvez utiliser
array_column
pour obtenir un tableau de valeurs pour la clé, et max il.max(array_column($array, 'Total'))
Il suffit de faire une
simple loop
et de comparer des valeurs ou de l'utilisationarray_reduce
Voir La Démo En Direct
@
au lieu de vérifier si une valeur existe vraiment est une mauvaise pratique, c'est de loin le plus de la réponse correcte.array_reduce
est destiné à ce genre de solutions.C'est tellement algorithme de base.
Travail de démonstration
$max
avec-9999999
?$v['Total']>$max
à$v['Total']<$max
et mettre$max = 9999999999;
vous pouvez modifier les noms de variables pour certains visiblity $max pour $min-Inf
🙂-9999
initialiser avec la première valeur (dans cet exemple, si serait$array[0]["Total"]
) ou une valeur particulière comme NULL ou false (vous devrez alors vérifier la valeur NULL/false dans leif
clause).$max = null;
alors simplement ajouter une condition pour vérifier que$max
a déjà été définie, commeif($v['Total']>$max || !$max)
. Dans ce cas, la première fois qu'il s'exécute à travers la boucle et il n'y a pas un$max
valeur définie, il sera mis un. L'hypothèse est que, même si c'est la seule et unique valeur, il serait techniquement max quel que soit arbitraire minimum vous avez codé en dur.Je sais que cette question est ancienne, mais je donne la réponse suivante en réponse à une autre question que de relever ici après avoir été marqué comme un doublon. C'est une autre solution, que je ne vois pas mentionné dans le courant des réponses.
Vous pouvez vous déplacer qu'avec
array_column
qui permet d'obtenir la valeur maximale très facile:Obtenir la clé associative est là que ça devient un peu plus délicat, compte tenu de ce que vous pourriez voulez vraiment plusieurs touches (si
$max
correspond à plus d'une seule valeur). Vous pouvez le faire avec une fonction anonyme à l'intérieur dearray_map
, et l'utilisationarray_filter
pour supprimer lenull
valeurs:De sortie:
Si vous vous retrouvez avec de multiples touches, mais ne sont intéressés que dans la première correspondance trouvée, il suffit de faire référence
$keys[0]
.une autre méthode simple sera
Peut être fait en utilisant array_walk(array_walk_recursive si nécessaire)
$arr est le tableau que vous souhaitez rechercher dans
Vous pouvez utiliser php usort fonction:
http://php.net/manual/en/function.usort.php
Un assez bon exemple est donné ici:
De sorte qu'il sera régler la valeur maximale pour le dernier index de tableau.
De sortie:
Cet exemple est donné sur le lien ci-dessus