web-dev-qa-db-ja.com

多次元配列の最高値を見つける

問題

以下のような多次元配列があります。私が達成しようとしているのは、配列から最高の「合計」値を持つものを見つけて取得する方法です。今ではmaxと呼ばれる関数がありますが、多次元配列では機能しませんこのような。

私が考えていたのは、foreachループを作成し、合計のみを含む新しい配列を作成し、maxを使用して最大値を見つけることです。これにより、残りのその最大値に関連するデータ。それが最も効率的な方法であるかどうかはわかりません。

何か案は?

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

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

    [2] => Array
        (
            [Key3] => Key3
            [Total] => 39
        )
)
29
Karl

PHP 5.5なので、_array_column_を使用して特定のキーの値の配列を取得し、それを最大化できます。

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

49
Astrus

simple loopを実行して値を比較するか、array_reduceを使用するだけです

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

print_r($data);

ライブデモを参照

25
Baba

それはとても基本的なアルゴリズムです。

$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

私はこの質問が古いことを知っていますが、重複としてマークされた後にここで指し示した別の質問に答えて、次の回答を提供しています。これは、現在の回答で言及されていない別の選択肢です。

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
<?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.

別の簡単な方法は

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

print_r( max( $max ) );
2
bystwn22

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

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
Umair Khan