在多维多维数组中获得最高价值

时间:2017-05-17 03:00:49

标签: php arrays loops for-loop multidimensional-array

我需要获得多维数组中的最大值或最大值。

这是我的数组$array

[pay] => Array
(
    [0] => Array
        (
            [title] => Array
                (
                    [name] => 'hi'
                )
            [payment] => Array
                (
                    [amount] => 35
                    [currency] => USD
                )
        )

    [1] => Array
        (
            [title] => Array
                (
                    [name] => 'lol'
                )
            [payment] => Array
                (
                    [amount] => 50
                    [currency] => USD
                )
        )

    [2] => Array
        (
            [title] => Array
                (
                    [name] => 'ok'
                )
            [payment] => Array
                (
                    [amount] => 30
                    [currency] => USD
                )
        )
)

我需要获得amount的最大值50,我该怎么做?

这是我尝试过的但它不起作用:

$max = -9999999; //will hold max val
$found_item = null; //will hold item with max val;

foreach($array as $k=>$v)
{
    if($v['Total']>$max)
    {
        $max = $v['Total'];
        $found_item = $v;
    }
}

6 个答案:

答案 0 :(得分:3)

简单就像这个单线。获取payment列数据,然后从生成的数组中提取amount数据,然后获取最大值。做完了。 (对不起,我花了这么长时间 - 我不得不将你发布的数组转换为可用的php数组。)

输入:

$array=["pay" => [
            ["title"=>["name"=>'hi'],"payment"=>["amount"=>35,"currency"=>"USD"]],
            ["title"=>["name"=>'lol'],"payment"=>["amount"=>50,"currency"=>"USD"]],
            ["title"=>["name"=>'ok'],"payment"=>["amount"=>30,"currency"=>"USD"]]
    ]
];

方法#1(Demo):

echo max(array_column(array_column($array["pay"],"payment"),"amount"));

方法#2(Demo):

$max=0;
foreach($array["pay"] as $subarray){
    if($max<$subarray["payment"]["amount"]){
        $max=$subarray["payment"]["amount"];
    }
}
echo $max;

方法#3(Demo):

$payments=array_column($array["pay"],"payment"); // declare payments array
rsort($payments);                                // sort by amount DESC
echo $payments[0]["amount"];                     // access the first amount value

输出:

50

方法#1的好处是:代码简洁,没有条件语句,没有全局变量声明/覆盖,只是直接到最大值。什么不爱!

如果方法#1太可怕了,你可以使用我的方法#2(首先由aendeerei发布)。我不喜欢它,因为它需要额外的步骤来初始化$ max变量,对每次迭代执行条件检查,并在适当时覆盖$max变量。 foreach循环的实际性能取决于数组的大小,但这两种方法之间的差异对人类来说是不可察觉的。

方法3可能是我的新宠,因为在完全通过键访问之前没有条件和两个函数。但是,它确实需要声明输入数组的部分副本,必须对其进行排序。无论如何,接受你的选择 - 这是完全相同的结果。

答案 1 :(得分:1)

试试这个希望这会有所帮助。在这里,我们只是使用简单的foreach来完成它。

解决方案1:

try this code snippet here

$max=0;
foreach($yourArray["pay"] as $value)
{
    if($max<$value["payment"]["amount"])
    {
        $max=$value["payment"]["amount"];
    }
}
echo $max;

解决方案2:

仅出于测试目的,我已将您array转换为json。在这里,我们使用array_column两次来获取列

Try this code snippet here

$internals=array_column($yourArray["pay"],"payment");//retrieving payments
$amounts=array_column($internals, "amount");//retrieving amounts
arsort($amounts);
print_r(array_values($amounts)[0]);

答案 2 :(得分:1)

  

使用Usort并获得第一个索引

$arr= array
(
     array
        (
            'payment' => array
                (
                    'amount' => 35,
                    'currency' => 'USD'
                )
        ),

     array
        (
            'payment' => array
                (
                    'amount' => 50,
                    'currency' => 'USD'
                )
        ),
     array
        (
            'payment' => array
                (
                    'amount' => 80,
                    'currency' => 'USD'
                )
        )
);

function sortAmount($x, $y) {
    return $y['payment']['amount'] - $x['payment']['amount'];
}

usort($arr, 'sortAmount');
echo "<pre>";
$highest=$arr[0];
print_r($highest)
//for value only
$highest=$arr[0]['payment']['amount'];

工作小提琴 http://phpfiddle.org/main/code/p5hw-ivei

答案 3 :(得分:1)

$max = 0;
foreach ($array['pay'] as $key => $item) {
    $amount = $item['payment']['amount'];
    if ($amount > $max) {
        $max = $amount;
    }
}
echo $max;

答案 4 :(得分:1)

简写:

$result = array_reduce($array['pay'], function($a, $b){
  return $a ? ($a['payment']['amount'] > $b['payment']['amount'] ? $a : $b) : $b;
});

var_dump($result['payment']['amount']);

答案 5 :(得分:0)

使用名为pay的数组来考虑此示例。您可以将此方法用于您自己的阵列。此代码适用于n个元素的数组。在这里,我将3视为名为$ pay的数组中的元素数。您可以在3的位置替换数组中的最大元素,以控制循环控制变量&#39; i&#39;。

$big=$pay[0];
for($i=1; $i<3; $i++){
 if($pay[i]>$big)
     $big=$pay[i];
}
echo $big;

我希望这就是你要找的东西。要求任何澄清。