問題
以下のような多次元配列があります。私が達成しようとしているのは、配列から最高の「合計」値を持つものを見つけて取得する方法です。今では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]
を参照してください。
<?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);
別の簡単な方法は
$max = array_map( function( $arr ) {
global $last;
return (int)( ( $arr["Total"] > $last ) ? $arr["Total"] : $last );
}, $array );
print_r( max( $max ) );
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 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
この例は、前述のリンクで提供されています