Retorna o índice de maior valor em uma matriz


91

De uma matriz que se parece com o seguinte, como posso obter o índice do maior valor na matriz. Para a matriz abaixo, o resultado desejado seria '11'.

Array (
    [11] => 14
    [10] => 9
    [12] => 7
    [13] => 7
    [14] => 4
    [15] => 6
)

Já faz um tempo, mas seu array já parece ordenado (decrescente); ou é um mau exemplo ou você realmente só precisa reset($arr); echo key($arr);:)
Ja͢ck

Respostas:


205

Minha solução é:

$maxs = array_keys($array, max($array))

Nota:
desta forma, você pode recuperar todas as chaves relacionadas a um determinado valor máximo .

Se você estiver interessado em apenas uma chave entre todas, simplesmente use $ maxs [0]


Como ver se dois valores são iguais?
AlphaMale

você pode verificar o resultado se tem dois ou mais valores se tem duplicatas
Julio Popócatl

@AlphaMale, você quer dizer duas chaves, suponho, já que o valor máximo é apenas um por definição .. @JustinE se você não quiser chaves duplicadas, basta pesquisar o máximo (ou seja, evitar array_keys) e você obterá apenas uma chave correspondente ao máximo valor
drAlberT

36
<?php

$array = array(11 => 14,
               10 => 9,
               12 => 7,
               13 => 7,
               14 => 4,
               15 => 6);

echo array_search(max($array), $array);

?>

array_search () retorna valores:

Retorna a chave para a agulha se for encontrada na matriz, FALSO caso contrário.

Se a agulha for encontrada no palheiro mais de uma vez, a primeira chave correspondente será retornada. Para retornar as chaves de todos os valores correspondentes, use array_keys () com o parâmetro search_value opcional.


12

Eu sei que já está respondido, mas aqui está uma solução que considero mais elegante:

arsort($array);
reset($array);
echo key($array);

e voila!


4
o resetnão é necessário, aliás.
kuroi neko,

3

Outras respostas podem ter um código mais curto, mas este deve ser o mais eficiente e fácil de entender.

/**
 * Get key of the max value
 *
 * @var array $array
 * @return mixed
*/
function array_key_max_value($array)
{
    $max = null;
    $result = null;
    foreach ($array as $key => $value) {
        if ($max === null || $value > $max) {
            $result = $key;
            $max = $value;
        }
    }

    return $result;
}

1

Algo como isso deve funcionar

function array_max_key($array) {
  $max_key = -1;
  $max_val = -1;

  foreach ($array as $key => $value) {
    if ($value > $max_val) {
      $max_key = $key;
      $max_val = $value;
    }
  }

  return $max_key;
}

3
É melhor usar a chave e o valor do primeiro item como o valor padrão.
Gumbo,

1

Minha solução para obter a chave mais alta é a seguinte:

max(array_keys($values['Users']));

0
$newarr=arsort($arr);
$max_key=array_shift(array_keys($new_arr));

0
<?php 
$array =  array (
    '11' => 14,
    '10' => 9,
    '12' => 7,
    '13' => 7,
    '14' => 4,
    '15' => 6
);

foreach ($array as $key => $value) {
   if ($value >= $max) 
        $max = max($array);          
}
echo " The array in Maximum Value :".$max."<br/>";
?> 

-7

Função retirada de http://www.php.net/manual/en/function.max.php

function max_key($array) {
    foreach ($array as $key => $val) {
        if ($val == max($array)) return $key; 
    }
}

$arr = array (
    '11' => 14,
    '10' => 9,
    '12' => 7,
    '13' => 7,
    '14' => 4,
    '15' => 6
);

die(var_dump(max_key($arr)));

Funciona como um encanto


8
Sem falar em desempenho. Para acessar a matriz, verificar o valor máximo todas as vezes é ainda pior do que "má prática".
bisko

1
Eu mencionei que não é minha implementação. Foi um copiar / colar rápido e sujo que o OP obviamente não poderia fazer sozinho, senhor.
Timur Asaliev

3
Não vou mentir, você me fez rir um pouco. Você está preocupado com max () para cada iteração através da matriz? É "pior do que uma prática ruim". Não, eu não acredito que seja. Não é o mais elegante, mas funciona.
Sean de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.