max

(PHP 4, PHP 5, PHP 7, PHP 8)

max查找最高值

描述

max(混合 $value, 混合 ...$values): 混合

备用签名(不支持使用命名参数)

max(数组 $value_array): 混合

如果第一个也是唯一的参数是数组,max() 返回该数组中的最高值。如果提供了至少两个参数,max() 返回这些值中最大的值。

注意:

不同类型的值将使用 标准比较规则 进行比较。例如,非数字 字符串 将与 整数 进行比较,就好像它是 0 一样,但多个非数字 字符串 值将按字母顺序进行比较。返回的实际值将是原始类型,不会应用任何转换。

警告

传递不同类型参数时要小心,因为 max() 可能会产生不可预测的结果。

参数

value

任何 可比较 的值。

values

任何 可比较 的值。

value_array

包含值的数组。

返回值

max() 返回根据标准比较被认为“最高”的参数值。如果多个不同类型的值在比较时结果相等(例如 0'abc'),则将返回传递给函数的第一个值。

错误/异常

如果传递空数组,max() 将抛出 ValueError

变更日志

版本 描述
8.0.0 max() 现在在失败时会抛出 ValueError;之前,会返回 false 并发出 E_WARNING 错误。
8.0.0 由于 字符串到数字的比较 发生了改变,max() 在这些情况下不再根据参数顺序返回不同的值。

示例

示例 #1 max() 的示例用法

<?php
echo max(2, 3, 1, 6, 7); // 7
echo max(array(2, 4, 5)); // 5

// 这里我们比较 -1 < 0,所以 'hello' 是最高值
echo max('hello', -1); // hello

// 对于多个不同长度的数组,max 返回最长的数组
$val = max(array(2, 2, 2), array(1, 1, 1, 1)); // array(1, 1, 1, 1)

// 多个相同长度的数组从左到右进行比较
// 所以在我们这个例子中:2 == 2,但是 5 > 4
$val = max(array(2, 4, 8), array(2, 5, 1)); // array(2, 5, 1)

// 如果同时给出了数组和非数组,则会返回数组
// 因为比较将数组视为大于任何其他值
$val = max('string', array(2, 5, 7), 42); // array(2, 5, 7)

// 如果一个参数为 NULL 或布尔值,它将使用规则 FALSE < TRUE 与其他值进行比较,无论其他类型如何
// 在下面的示例中,-10 在比较中被视为 TRUE
$val = max(-10, FALSE); // -10

// 另一方面,0 被视为 FALSE,所以“小于”TRUE
$val = max(0, TRUE); // TRUE
?>

参见

  • min() - 查找最低值
  • count() - 统计数组或 Countable 对象中的所有元素

添加笔记

用户贡献笔记 20 笔

up
67
keith at bifugi dot com
8 年前
最简单的方法是使用 array_search 来解决 max() 不返回键的问题

<?php
$student_grades
= array ("john" => 100, "sarah" => 90, "anne" => 100);
$top_student = array_search(max($student_grades),$student_grades); // john
?>

也可以使用 array_flip 来完成,但覆盖会导致返回最后一个最大值而不是第一个

<?php
$grades_index
= array_flip($student_grades);
$top_student = $grades_index[max($student_grades)]; // anne
?>

获取所有最大值键

<?php
$top_students
= array_keys($student_grades,max($student_grades)); // john, anne
?>
up
5
Samu
10 个月前
现代 PHP 版本支持函数参数的数组展开运算符,因此很容易像这样调用 max()

<?php
function stuff(): iterable {
// 此函数可能产生 0、1 或 n 个值。
}

$foo = max(...stuff());
?>

但是,如果不能保证生成器至少产生两个值,则这很危险。

这里需要注意的是,当 max() 接收单个参数时,它必须是值数组。(当生成器不产生任何值时,max() 将抛出 ArgumentCountError。)

如果可以保证生成器至少产生一个值,那么通过依赖上述数组预期,可以安全地调用 max

<?php
function stuff(): iterable {
// 此函数将产生 1...n 个值。
}

// 注意,这里生成器首先被读入一个数组。
$foo = max([...stuff()]);
?>

如果数组为空,max() 将抛出 ValueError。

增加的负担是,有缺陷的代码可能看起来工作得很好,但在随机情况下会失败,这可能会在最初导致很多头疼。
up
16
deoomen
2 年前
在 PHP 8.0 之后要注意!

示例代码

<?php
echo max(0,'hello');
?>

在 PHP 8.0 之前将返回 int(0),但从 PHP 8.0 开始,上面的代码将返回 string("hello")!
up
21
volch5 at gmail dot com
10 年前
对 DateTime 对象的 max()(和 min())将它们像日期(带时区信息)一样进行比较,并返回 DateTime 对象。
<?php
$dt1
= new DateTime('2014-05-07 18:53', new DateTimeZone('Europe/Kiev'));
$dt2 = new DateTime('2014-05-07 16:53', new DateTimeZone('UTC'));
echo
max($dt1,$dt2)->format(DateTime::RFC3339) . PHP_EOL; // 2014-05-07T16:53:00+00:00
echo min($dt1,$dt2)->format(DateTime::RFC3339) . PHP_EOL; // 2014-05-07T18:53:00+03:00
?>

它至少在 5.3.3-7+squeeze17 上运行
up
8
johnphayes at gmail dot com
18 年前
关于 min() 和 max() 中的布尔参数

(a) 如果任何参数是布尔值,max 和 min 将把其余参数强制转换为布尔值以进行比较。
(b) true > false
(c) 但是,max 和 min 将返回赢得比较的实际参数值(而不是强制转换的值)。

以下是一些测试用例来说明这一点

1. max(true,100)=true
2. max(true,0)=true
3. max(100,true)=100
4. max(false,100)=100
5. max(100,false)=100
6. min(true,100)=true
7. min(true,0)=0
8. min(100,true)=100
9. min(false,100)=false
10. min(100,false)=false
11. min(true,false)=false
12. max(true,false)=true
up
14
Alex Rath
14 年前
请注意,每当字符串前面有数字时,它将用于比较。

<?php

max
('7iuwmssuxue', 1); // 返回 7iuwmssuxu
max('-7suidha', -4); // 返回 -4

?>

但仅当它位于字符串前面时

<?php

max
('sdihatewin7wduiw', 3); // 返回 3

?>
up
8
ries at vantwisk dot nl
15 年前
我曾多次遇到使用 max 比使用 if/then/else 结构慢得多的情况。请务必在您的例程中检查这一点!

Ries
up
17
costinu
12 年前
max(null, 0) = null
max(0, null) = 0
up
10
ReVo_
10 年前
有时您可能需要从如下所示的数组中获取最大值

<?php
$arrTest
= array(
array(
"day" => 1, "b" => 10 ),
array(
"day" => 2, "b" => 43 ),
array(
"day" => 3, "b" => 2 ),
array(
"day" => 4, "b" => -3 ),
array(
"day" => 5, "b" => 4 ),
array(
"day" => 6, "b" => -5 )
);
?>
我看到的所有 max 函数都无法提供一种方法来获取(例如)键“b”中的值的 最大值。

<?php
function maxValueInArray($array, $keyToSearch)
{
$currentMax = NULL;
foreach(
$array as $arr)
{
foreach(
$arr as $key => $value)
{
if (
$key == $keyToSearch && ($value >= $currentMax))
{
$currentMax = $value;
}
}
}

return
$currentMax;
}

// 数组键
$value = maxValueInArray($arrTest, "b");

?>

输出:43
up
10
marcini
15 年前
请注意,max() 可以比较日期,因此如果您编写类似下面的代码

<?php
$dates
= array('2009-02-15', '2009-03-15');
echo
max($dates);
?>

您将得到:2009-03-15。
up
2
info at osworx dot net
5 年前
如果您使用类似下面的数组(例如,来自购物车的商品)(请注意)
<?php
Array
(
[
0] => 142,80
[1] => 39,27
[2] => 22,80
[3] => 175,80
)?>
结果将是:39,27,而不是预期结果 - 175,80

因此,要查找最大值,请仅使用整数,例如
<?php
Array
(
[
0] => 14280
[1] => 3927
[2] => 2280
[3] => 17580
)?>
您将得到正确的结果:17580
up
1
blackmac01 at gmail dot com
4 年前
回复:keith at bifugi dot com

如果您想查找数组中与最大值匹配的特定键(这些值可能是重复的),您可以循环遍历并执行简单的检查
<?php

# 示例数组
$a = array(
'key1' => 100,
'key2' => 90,
'key3' => 100,
'key4' => 90,
);

# 首先获取最大值
$max = max($a);

# 创建一个包含所有具有最大值的键的新数组
foreach($a as $key => $val) {
if(
$val === $max) $b[] = $key;
}

# 如果您想要一个字符串列表,只需执行以下操作
$b = implode(' ', $b);
?>

这会产生一致的结果,并且在性能方面具有良好的扩展性,而诸如 array_search 和 array_flip 之类的函数在处理大量数据时会导致性能下降。
up
3
php at rijkvanwel dot nl
13 年前
要获取数组中的最大键

<?php
$array
= array( 0 => 'first', 1=> 'second', /* ... */ 99 => 'nth' );
$max_key = max( array_keys( $array ) ); // 99
?>
up
2
michaelangel0 at mail.com
17 年前
Matlab 用户和其他用户在没有 min 和 max 函数的双参数输出的情况下可能会感到孤独。

要获取数组中最大值的索引以及值本身,请使用以下方法或其派生方法

<?php
function doublemax($mylist){
$maxvalue=max($mylist);
while(list(
$key,$value)=each($mylist)){
if(
$value==$maxvalue)$maxindex=$key;
}
return array(
"m"=>$maxvalue,"i"=>$maxindex);
}
?>
up
1
sun at drupal dot org
13 年前
请注意,如果数组为空,max() 会抛出警告

<?php
$a
= array();
max($a);
// Warning: max(): Array must contain at least one element
?>

因此请确保您的数据不为空。
up
0
harmor
16 年前
在两个值之间限制整数的一种方法是

<?php
function bound($x, $min, $max)
{
return
min(max($x, $min), $max);
}
?>

这与以下代码相同

<?php
$tmp
= $x;
if(
$tmp < $min)
{
$tmp = $min;
}
if(
$tmp > $max)
{
$tmp = $max;
}
$y = $tmp;
?>

因此,如果您想将整数限制在 1 到 12 之间,例如

输入
<?php
$x
= 0;
echo
bound(0, 1, 12).'<br />';
$x = 1;
echo
bound($x, 1, 12).'<br />';
$x = 6;
echo
bound($x, 1, 12).'<br />';
$x = 12;
echo
bound($x, 1, 12).'<br />';
$x = 13;
echo
bound($x, 1, 12).'<br />';
?>

输出
1
1
6
12
12
up
-3
levim at php dot net
11 年前
<?php
/**
* @param array $array
*
* @return int|null 返回数组中最大的值。如果未找到整数,则返回 NULL。
*/
function array_max_recursive(array $array) {
$max = NULL;
$stack = array($array);

do {
$current = array_pop($stack );
foreach (
$current as $value) {
if (
is_array($value)) {
$stack[] = $value;
} elseif (
filter_var($value, FILTER_VALIDATE_INT) !== FALSE) {
// max(NULL, 0) 返回 NULL,因此将其强制转换为 int
$max = (int) max($max, $value);
}
}

} while (!empty(
$stack));

return
$max;
}
?>

- 此函数实际上不是递归函数,但满足它对子数组起作用的要求。我这样做是因为 PHP 在递归方面不太好。我还这样做是因为我喜欢用这种方式做事。
- 它返回 int 类型的值,而不是 int 的字符串表示。唯一例外是当您提供一个不包含任何整数的数组时。在这种情况下,它将返回 NULL。
- 它会忽略非数组、非 int 值。
up
-4
toon dot baeyens at gmail dot com
12 年前
一个用于多维数组的小函数
<?php
function amax($array){
if(
is_array($array)){
foreach(
$array as $key => $value){
$array[$key] = amax($value);
}
return
max($array);
}else{
return
$array;
}
}
?>
up
-5
chris at candm dt org dt uk
3 年前
一个用于返回数组中最大值键的函数。对于多个最大值,它将返回第一个的键。将 > 更改为 >= 以获取最后一个。

function array_max_key($arr) {
$maxkey='';
$maxval=false;
array_walk($arr,
function (&$cval,&$ckey) use(&$maxkey,&$maxval) {
if ($maxval === false || $cval > $maxval) {
$maxval = $cval;
$maxkey = $ckey;
}
}
);
return $maxkey;
}
up
-9
Michael Blinn
5 年前
小心在对象上使用 max(),因为它返回的是引用而不是新对象。

<?php

$min_date
= date_create('2019-03-05');
$max_date = date_create('2019-03-06');

$date_by_reference = max($min_date, $max_date);

// $date_by_reference 和 $max_date 现在是同一个对象

echo '$max_date is ' . date_format($max_date, 'Y-m-d') . PHP_EOL; // '2019-03-06'
echo '$date_by_reference is ' . date_format($date_by_reference, 'Y-m-d') . PHP_EOL; // '2019-03-06'

date_add($date_by_reference, date_interval_create_from_date_string('1 days')); // 向 $date_by_reference 添加 1 天,也会更改 $max_date

echo '$max_date is changed ' . date_format($max_date, 'Y-m-d') . PHP_EOL; // '2019-03-07'
echo '$date_by_reference is changed ' . date_format($date_by_reference, 'Y-m-d') . PHP_EOL; // '2019-03-07'

?>
To Top