【问题标题】: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 数组变量。

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


【解决方案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。
    猜你喜欢
    • 2017-11-03
    • 2015-04-22
    • 2021-10-17
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多