获取多维数组中的最大值[重复]

Posted

技术标签:

【中文标题】获取多维数组中的最大值[重复]【英文标题】:Get highest value in multi multidimensional array [duplicate] 【发布时间】:2017-10-16 07:43:42 【问题描述】:

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

这是我的数组$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;
    

【问题讨论】:

您能告诉我为什么您使用[pay] => Array 形式而不是普通的'pay' => Array php 形式吗?这是一个新的 PHP 功能吗?或者只是你的伪代码?谢谢。 @aendeerei 这就是 print_r() 在屏幕上的显示方式。 OP的数组结构没有问题。请参阅我的答案以获取可用的 php 数组变量。 【参考方案1】:

就这么简单。获取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 可能是我最喜欢的新方法,因为在纯按键访问之前没有条件,只有两个函数。但是,它确实需要声明必须排序的输入数组的部分副本。不管怎样,你自己选吧——结果都是一样的。

【讨论】:

@JohnJaoill 这将优于 Sahil 的答案,因为不需要对数组进行排序然后重新索引。【参考方案2】:

使用 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

【讨论】:

仅供参考:$highest=$arr[0]['payment']['amount']; @mickmackusa:谢谢,我更新了答案 我认为这是一个聪明的方法,但是您必须修改 OP 的输入数组才能使其工作。 sandbox.onlinephpfunctions.com/code/…【参考方案3】:
$max = 0;
foreach ($array['pay'] as $key => $item) 
    $amount = $item['payment']['amount'];
    if ($amount > $max) 
        $max = $amount;
    

echo $max;

【讨论】:

如果你不打算使用$key,你可以在foreach()中省略它 @mickmackusa 好点!我知道,但还是谢谢你。【参考方案4】:

速记:

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

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

【讨论】:

我喜欢这种方法,但我不喜欢。我通常不倾向于array_reduce(),但它似乎可以解决这个问题。我不确定我有多喜欢嵌套的三元运算符。无论如何,这是一个很好的证明。【参考方案5】:

试试这个希望这会有所帮助。这里我们只是使用简单的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]);

【讨论】:

【参考方案6】:

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

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

echo $big;

我希望这是您正在寻找的。要求任何澄清。

【讨论】:

"pay" 不是数组,它是$array 中的第一个键名。你真的应该使用 count() 而不是硬编码的 3。

以上是关于获取多维数组中的最大值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JS----使用归递获取多维数组中的某列值

在多维数组javascript或coffeescript中获取最大值

获取多维 NumPy 数组中最大值的位置

PHP多维数组搜索并获取键的数组[重复]

在不循环多维数组PHP的情况下获取第一个子数组键[重复]

如何从多维数组中获取每个索引的最大值-javascript