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

Я, наконец, сделал это с помощью scalaj-http вместо Dispatch. Вызов синхронный, но это соответствует моему варианту использования.

Я думаю, что Spark Job никогда не заканчивает использование Dispatch, потому что соединение Http не было закрыто должным образом.

С наилучшими пожеланиями

29
задан Karl 27 June 2013 в 09:25
поделиться

8 ответов

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

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

47
ответ дан Astrus 27 June 2013 в 09:25
поделиться

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

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

print_r($data);

См. Демо

24
ответ дан Baba 27 June 2013 в 09:25
поделиться
1113 Я знаю, что этот вопрос старый, но я даю следующий ответ в ответ на другой вопрос, который указывался здесь после того, как был отмечен как дубликат. Это еще одна альтернатива, о которой я не упоминаю в текущих ответах.

Я знаю, что есть функция с именем 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].

7
ответ дан mister martin 27 June 2013 в 09:25
поделиться

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

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

1
ответ дан geisterfurz007 27 June 2013 в 09:25
поделиться

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

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

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

10
ответ дан Robert 27 June 2013 в 09:25
поделиться

другим простым методом будет

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

print_r( max( $max ) );
2
ответ дан bystwn22 27 June 2013 в 09:25
поделиться
<?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);
2
ответ дан Nabi K.A.Z. 27 June 2013 в 09:25
поделиться

Может быть сделано с использованием 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;
    }
});
1
ответ дан katona.abel 27 June 2013 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: