Подтвердить что ты не робот

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

Проблема

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

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

Любые идеи?

Array
(
    [0] => Array
        (
            [Key1] => Key1
            [Total] => 13
        )

    [1] => Array
        (
            [Key2] => Key2
            [Total] => 117
        )

    [2] => Array
        (
            [Key3] => Key3
            [Total] => 39
        )
)
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

print_r($data);

Смотрите демо-версию

Ответ 3

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

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

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

Ответ 4

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

Я знаю функцию 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].

Ответ 5

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

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

print_r( max( $max ) );

Ответ 6

Вы можете использовать функцию 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

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

Ответ 7

Может быть выполнено с помощью 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;
    }
});

Ответ 8

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

Ответ 9

print_r (max(array_values($array)));

возвращает имена и значения для каждого ключа