PHP Conference Japan 2024

max

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

max找出最大值

描述

max(mixed $value, mixed ...$values): mixed

替代簽名 (不支援具名參數)

max(array $value_array): mixed

如果第一個也是唯一的參數是一個陣列,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() - 計算陣列或可計數物件中的所有元素

新增筆記

使用者貢獻的筆記 18 個筆記

67
keith at bifugi dot com
8 年前
要解決 max() 不會提供鍵的事實,最簡單的方法是 array_search

<?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
?>
4
Samu
1 年前
由於現代 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。

額外的負擔是,有缺陷的程式碼可能會看起來運作良好,但卻會隨機失敗,一開始可能會讓人非常困惑。
14
deoomen
2 年前
注意 PHP 8.0 之後的變化!

程式碼範例

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

在 PHP 8.0 之前會回傳 int(0),但自 PHP 8.0 起,以上程式碼會回傳 string("hello")!!
20
volch5 at gmail dot com
10 年前
max()(和 min())在 DateTime 物件上會像比較日期一樣比較(包含時區資訊)並回傳 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 版本中可以運作
13
Alex Rath
14 年前
請注意,只要字串前面有數字,就會使用該數字進行比較。

<?php

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

?>

但僅限於它在字串前面的情況

<?php

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

?>
7
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
15
costinu
12 年前
max(null, 0) = null
max(0, null) = 0
7
ries at vantwisk dot nl
16 年前
我有幾次遇到使用 max 比使用 if/then/else 結構慢很多的情況。請務必在您的常式中檢查這一點!

Ries
9
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
9
marcini
15 年前
請注意 max() 可以比較日期,所以如果您寫入如下的程式碼

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

您將會得到:2009-03-15。
3
php at rijkvanwel dot nl
13 年前
要取得陣列中最大的鍵

<?php
$array
= array( 0 => 'first', 1=> 'second', /* ... */ 99 => 'nth' );
$max_key = max( array_keys( $array ) ); // 99
?>
1
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
0
blackmac01 at gmail dot com
5 年前
回覆: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` 等函數在處理大量資料時可能會導致效能下降。
1
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);
}
?>
0
sun at drupal dot org
13 年前
請注意,如果陣列為空,`max()` 會拋出警告。

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

因此,請確保您的資料不為空。
-1
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
-4
levim at php dot net
12 年前
<?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,因此請轉換為整數
$max = (int) max($max, $value);
}
}

} while (!empty(
$stack));

return
$max;
}
?>

- 此函數實際上並非遞迴,但滿足了在子陣列上運作的要求。我這樣做是因為 PHP 並不擅長遞迴。我這樣做也是因為我喜歡這樣做。
- 它會返回 `int` 類型的值,絕不是 `int` 的字串表示形式。例外情況是當您提供的陣列不包含任何整數時。然後它將返回 `NULL`。
- 它會忽略非陣列、非 `int` 值。
-5
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;
}
}
?>
To Top