Le problème
J'ai un tableau multidimensionnel similaire à celui ci-dessous. Ce que j'essaie d'atteindre, c'est un moyen de trouver et de récupérer dans le tableau celui qui a la valeur "Total" la plus élevée, maintenant je sais qu'il y a une fonction appelée max
mais qui ne fonctionne pas avec un tableau multidimensionnel comme ça.
Ce que j'ai pensé à faire est de créer une boucle foreach et de construire un nouveau tableau avec seulement les totaux, puis en utilisant max
pour trouver la valeur maximale, ce qui fonctionnerait, le seul problème serait alors de récupérer le reste de les données qui se rapportent à cette valeur maximale. Je ne suis pas sûr que ce soit le moyen le plus efficace non plus.
Des idées?
Array
(
[0] => Array
(
[Key1] => Key1
[Total] => 13
)
[1] => Array
(
[Key2] => Key2
[Total] => 117
)
[2] => Array
(
[Key3] => Key3
[Total] => 39
)
)
Depuis PHP 5.5 vous pouvez utiliser array_column
Pour obtenir un tableau de valeurs pour une clé spécifique, et max.
max(array_column($array, 'Total'))
Faites juste un simple loop
et comparer les valeurs ou utiliser array_reduce
$data = array_reduce($data, function ($a, $b) {
return @$a['Total'] > $b['Total'] ? $a : $b ;
});
print_r($data);
C'est un algorithme tellement basique.
$max = -9999999; //will hold max val
$found_item = null; //will hold item with max val;
foreach($arr as $k=>$v)
{
if($v['Total']>$max)
{
$max = $v['Total'];
$found_item = $v;
}
}
echo "max value is $max";
print_r($found_item);
Je sais que cette question est ancienne, mais je fournis la réponse suivante en réponse à une autre question qui pointait ici après avoir été marquée comme doublon. C'est une autre alternative que je ne vois pas mentionnée dans les réponses actuelles.
Je sais qu'il existe une fonction appelée max mais qui ne fonctionne pas avec un tableau multidimensionnel comme celui-ci.
Vous pouvez contourner cela avec array_column
ce qui facilite l'obtention de la valeur maximale:
$arr = [['message_id' => 1,
'points' => 3],
['message_id' => 2,
'points' => 2],
['message_id' => 3,
'points' => 2]];
// max value
$max = max(array_column($arr, 'points'));
Obtenir la clé associative est là où cela devient un peu plus délicat, étant donné que vous pouvez en fait vouloir plusieurs clés (si $max
correspond à plusieurs valeurs). Vous pouvez le faire avec une fonction anonyme à l'intérieur array_map
, et utilisez array_filter
pour supprimer les valeurs null
:
// keys of max value
$keys = array_filter(array_map(function ($arr) use ($max) {
return $arr['points'] == $max ? $arr['message_id'] : null;
}, $arr));
Sortie:
array(1) {
[0]=>
int(1)
}
Si vous vous retrouvez avec plusieurs clés mais que vous êtes uniquement intéressé par la première correspondance trouvée, faites simplement référence à $keys[0]
.
<?php
$myarray = array(
0 => array(
'Key1' => 'Key1',
'Total' => 13,
),
1 => array(
'Key2' => 'Key2',
'Total' => 117,
),
2 => array(
'Key2' => 'Key3',
'Total' => 39,
),
);
$out = array();
foreach ($myarray as $item) {
$out[] = $item['Total'];
}
echo max($out); //117
unset($out, $item);
une autre méthode simple sera
$max = array_map( function( $arr ) {
global $last;
return (int)( ( $arr["Total"] > $last ) ? $arr["Total"] : $last );
}, $array );
print_r( max( $max ) );
Peut être fait en utilisant array_walk (array_walk_recursive si nécessaire)
$ arr est le tableau dans lequel vous souhaitez rechercher
$largestElement = null;
array_walk($arr, function(&$item, $key) use (&$largestElement) {
if (!is_array($largestElement) || $largestElement["Total"] < $item["Total"]) {
$largestElement = $item;
}
});
Vous pouvez utiliser la fonction php usort: http://php.net/manual/en/function.usort.php
Un exemple assez illustratif est donné ici:
<?php
function cmp($a, $b)
{
return strcmp($a["fruit"], $b["fruit"]);
}
$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";
usort($fruits, "cmp");
while (list($key, $value) = each($fruits)) {
echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
?>
Ainsi, il triera la valeur maximale selon le dernier index du tableau.
Production:
$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons
Cet exemple est donné sur le lien susmentionné