Найти наибольшее значение в многомерном массиве

Проблема

У меня многомерный массив, подобный приведенному ниже. То, что я пытаюсь достичь, – это способ найти и извлечь из массива значение с самым высоким значением «Всего», теперь я знаю, что есть функция max но это не работает с многомерным массивом, подобным этому.

То, что я думал о создании, это создать цикл foreach и построить новый массив только с итоговыми значениями, а затем использовать max чтобы найти максимальное значение, которое будет работать, единственная проблема будет тогда извлекать остальную часть данных, относящуюся к это максимальное значение. Я не уверен, что это самый эффективный способ.

Есть идеи?

 Array ( [0] => Array ( [Key1] => Key1 [Total] => 13 ) [1] => Array ( [Key2] => Key2 [Total] => 117 ) [2] => Array ( [Key3] => Key3 [Total] => 39 ) ) 

Это так основной алгоритм.

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

Рабочая демонстрация

Просто выполните simple loop и сравните значения или используйте array_reduce

 $data = array_reduce($data, function ($a, $b) { return @$a['Total'] > $b['Total'] ? $a : $b ; }); print_r($data); 

Посмотреть демо-версию

Начиная с PHP 5.5 вы можете использовать array_column для получения массива значений для определенного ключа и максимального его значения.

max(array_column($array, 'Total'))

Я знаю, что этот вопрос старый, но я предоставляю следующий ответ в ответ на другой вопрос, который был указан здесь после того, как он был помечен как дубликат. Это еще одна альтернатива, о которой я не упоминал в текущих ответах.

Я знаю, что есть функция max, но это не работает с многомерным массивом вроде этого.

Вы можете обойти это с помощью array_column который упрощает получение максимального значения:

 $arr = [['message_id' => 1, 'points' => 3], ['message_id' => 2, 'points' => 2], ['message_id' => 3, 'points' => 2]]; // max value $max = max(array_column($arr, 'points')); 

Получение ассоциативного ключа – это то, где он становится немного более сложным, учитывая, что вам действительно может понадобиться несколько ключей (если $max соответствует более чем одному значению). Вы можете сделать это с анонимной функцией внутри array_map и использовать array_filter для удаления null значений:

 // keys of max value $keys = array_filter(array_map(function ($arr) use ($max) { return $arr['points'] == $max ? $arr['message_id'] : null; }, $arr)); 

Вывод:

 array(1) { [0]=> int(1) } 

Если вы в итоге получаете ключи с множественными значениями, но интересуетесь только найденным первым совпадением, просто укажите $keys[0] .

другой простой метод будет

 $max = array_map( function( $arr ) { global $last; return (int)( ( $arr["Total"] > $last ) ? $arr["Total"] : $last ); }, $array ); print_r( max( $max ) ); 

Вы можете использовать функцию php usort: http://php.net/manual/en/function.usort.php

Здесь приводится довольно показательный пример:

 <?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"; } 

?>

Поэтому он будет сортировать максимальное значение с последним индексом массива.

Вывод:

 $fruits[0]: apples $fruits[1]: grapes $fruits[2]: lemons 

Этот пример приведен на вышеупомянутой ссылке

Может быть сделано с помощью array_walk (array_walk_recursive при необходимости)

$ arr – массив, который вы хотите найти в

 $largestElement = null; array_walk($arr, function(&$item, $key) use (&$largestElement) { if (!is_array($largestElement) || $largestElement["Total"] < $item["Total"]) { $largestElement = $item; } }); 
 <?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);