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