Ответ 1
С PHP 5.5 вы можете использовать array_column
для получения массива значений для определенного ключа и максимального его значения.
max(array_column($array, 'Total'))
Проблема
У меня есть многомерный массив, подобный приведенному ниже. То, что я пытаюсь достичь, - это способ найти и извлечь из массива значение с самым высоким значением "Всего", теперь я знаю там функцию с именем max
, но это не работает с многомерным массивом, подобным этому.
То, что я думал о создании, - это создать цикл foreach и построить новый массив только с итоговыми значениями, а затем с помощью max
найти максимальное значение, которое будет работать, единственная проблема будет тогда извлекать остальную часть данные, которые относятся к этому максимальному значению. Я не уверен, что самый эффективный способ.
Любые идеи?
Array
(
[0] => Array
(
[Key1] => Key1
[Total] => 13
)
[1] => Array
(
[Key2] => Key2
[Total] => 117
)
[2] => Array
(
[Key3] => Key3
[Total] => 39
)
)
С PHP 5.5 вы можете использовать array_column
для получения массива значений для определенного ключа и максимального его значения.
max(array_column($array, 'Total'))
Просто выполните simple loop
и сравните значения или используйте array_reduce
$data = array_reduce($data, function ($a, $b) {
return @$a['Total'] > $b['Total'] ? $a : $b ;
});
print_r($data);
Это так основной алгоритм.
$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);
Я знаю, что этот вопрос старый, но я даю следующий ответ в ответ на другой вопрос, который был указан здесь после того, как помечен как дубликат. Это еще одна альтернатива, которую я не вижу упомянутой в текущих ответах.
Я знаю функцию 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);
print_r (max(array_values($array)));
возвращает имена и значения для каждого ключа