Проблема
У меня многомерный массив, подобный приведенному ниже. То, что я пытаюсь достичь, – это способ найти и извлечь из массива значение с самым высоким значением «Всего», теперь я знаю, что есть функция 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);