web-dev-qa-db-fra.com

Trouver la valeur la plus élevée dans un tableau multidimensionnel

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
        )
)
29
Karl

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'))

49
Astrus

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);

Voir la démo en direct

25
Baba

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);

Démo de travail

10
Robert

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].

7
mister martin
<?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);
2
Nabi K.A.Z.

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 ) );
2
bystwn22

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;
    }
});
1
katona.abel

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é

1
Umair Khan