2012-01-10 51 views
3

我試圖從陣列得到第二高的價值,我只是想知道是否有可能做這樣的事情MAX -1或我絕對需要由表進行排序和第二高值MAX - 1 php ??它存在嗎?

private function max_key($array) { 
    foreach ($array as $key => $val) { 
    if ($val == max($array)) return $key; 
    } 
    } 

回答

2
$a = Array (1, 2, 40 , 100); 
echo max($a) - 1; // definitely not 40 

所以,是的,你需要rsort()built-in PHP function, sorts the array with highest values first),然後採取從列表中第2個值。

注意,例如array(1 , 10 , 5 , 10)有第二個值==第一個值;如果你想要第二大的唯一值,首先運行它通過array_unique()

+1

應該是相當'$ A [計數( $(a)-2]''sort()'之後。否則應該使用'rsort()'。 – Narf 2012-01-10 14:44:37

+0

@Narf:很好,編輯。 – Piskvor 2012-01-10 14:45:58

-1

我不認爲你會找到一個MAX - 1功能。可能需要進行一種排序,然後在排序後的數組中進行第二個排序。

+2

冒泡排序?泡泡分揀?爲什麼在地球上你推薦了一種效率最低的算法,並且重新發明了這個算法?另請參見:精手冊 - http://php.net/manual/en/function.sort.php – Piskvor 2012-01-10 14:43:30

+0

你是對的,冒泡排序是一個壞主意 - 我更新我的回答 – jamesTheProgrammer 2012-01-10 14:46:21

0

最好的辦法是使用一個算法的qsort(更可讀代碼,更少調試)。如果你的數組/表格非常龐大(並且qsort可以爲你的代碼創建合理的性能問題),你可以執行一個線性搜索存儲在2個變量中的「max」和「max-1」元素:不是太貴要做,但你需要了解這項工作是否能給你帶來真正的優勢。

另一種形式給出,可以儘量保持直接在其源(SQL/DB表)來分類的陣列。

6

似乎沒有這種非標準的功能(這太具體的)。
您可以排序並獲得第二個值,但它的複雜性爲O(n log n)

O(n) solution

function second_key($array){ 
    $max=null; 
    $second = null; 
    foreach($array as $k => $v){ 
     if(!isset($max) || $v > $array[$max]){ 
      $second = $max; 
      $max = $k; 
     } 
     elseif(!isset($second) || $v > $array[$second]){ 
      $second = $k; 
     } 
    } 
    return $second; 
} 
+0

+1要走的路。我只是建議稍微改進一些代碼格式,例如爲了更好的可讀性,在運算符之前和之後添加空格,例如'>','='和'=>'。 – 2012-01-10 14:50:48

0
sort($array, SORT_NUMERIC); 
echo $array[ count($array) - 2 ]; 
0

max($array) - 1是行不通的。我會做這樣的事情:

$array = arsort($array); 
return isset($array[1]) ? $array[1] : FALSE;