Я, наконец, сделал это с помощью scalaj-http вместо Dispatch. Вызов синхронный, но это соответствует моему варианту использования.
Я думаю, что Spark Job никогда не заканчивает использование Dispatch, потому что соединение Http не было закрыто должным образом.
С наилучшими пожеланиями
Начиная с 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, но она не работает с многомерным массивом, подобным этому.
Вы можете обойти это с помощью 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]
.
Вы можете использовать функцию 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
Этот пример приведен по вышеупомянутой ссылке
Это такой простой алгоритм.
$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_map( function( $arr ) {
global $last;
return (int)( ( $arr["Total"] > $last ) ? $arr["Total"] : $last );
}, $array );
print_r( max( $max ) );
<?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);
Может быть сделано с использованием 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;
}
});