Chỉ số trả về giá trị cao nhất trong một mảng


92

Từ một mảng trông giống như sau, làm cách nào để lấy chỉ mục của giá trị cao nhất trong mảng. Đối với mảng bên dưới, kết quả mong muốn sẽ là '11'.

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

Đã lâu rồi, nhưng mảng của bạn dường như đã được sắp xếp (giảm dần); hoặc là nó là một ví dụ xấu hoặc bạn thực sự chỉ cần reset($arr); echo key($arr);:)
Jack

Câu trả lời:


209

Giải pháp của tôi là:

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

Lưu ý:
bằng cách này, bạn có thể truy xuất mọi khóa liên quan đến giá trị tối đa nhất định.

Nếu bạn chỉ quan tâm đến một khóa trong số tất cả, chỉ cần sử dụng $ maxs [0]


Làm thế nào để xem nếu hai giá trị giống nhau?
AlphaMale

bạn có thể kiểm tra kết quả, nếu có hai hoặc nhiều giá trị nếu có bản sao
Julio Popócatl

@AlphaMale, ý bạn là hai khóa, tôi cho rằng giá trị tối đa chỉ là một theo định nghĩa .. @JustinE nếu bạn không muốn các khóa trùng lặp, chỉ cần tìm kiếm giá trị tối đa (tức là tránh array_keys) và bạn sẽ chỉ nhận được một khóa tương ứng với giá trị tối đa giá trị
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 () trả về giá trị:

Trả về khóa cho kim nếu nó được tìm thấy trong mảng, FALSE nếu không.

Nếu kim được tìm thấy trong đống cỏ khô nhiều lần, khóa khớp đầu tiên sẽ được trả về. Để trả về các khóa cho tất cả các giá trị phù hợp, hãy sử dụng array_keys () với tham số search_value tùy chọn.


12

Tôi biết nó đã được trả lời nhưng đây là một giải pháp mà tôi thấy thanh lịch hơn:

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

và Voila!


4
các resetlà không cần thiết, btw.
kuroi neko

3

Các câu trả lời khác có thể có mã ngắn hơn nhưng mã này phải hiệu quả nhất và dễ hiểu.

/**
 * 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

Một cái gì đó như thế này nên làm thủ thuật

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
Tốt hơn hãy sử dụng khóa và giá trị của mục đầu tiên làm giá trị mặc định.
Gumbo 22/09/09

1

Giải pháp của tôi để có được khóa cao hơn như sau:

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

Hàm được lấy từ http://www.php.net/manual/en/ Chức năng.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)));

Hoạt động như một sự quyến rũ


8
Không phải nói về hiệu suất. Việc dò tìm thông qua mảng, kiểm tra giá trị tối đa mỗi lần thậm chí còn tệ hơn "hành vi xấu".
bisko 22/09/09

1
Tôi đã đề cập đến việc thực hiện nó không phải của tôi. Đó là một bản sao / dán nhanh chóng và bẩn thỉu mà rõ ràng OP không thể tự làm được, thưa ông.
Timur Asaliev 22/09/09

3
Sẽ không nói dối, bạn đã làm cho tôi cười khúc khích một chút. Bạn lo lắng về max () cho mỗi lần lặp qua mảng? Nó "tệ hơn cả thực hành xấu". Không, tôi không tin là có. Nó không phải là thanh lịch nhất, nhưng nó hoạt động.
Sean
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.