Макс - 1 php ??Это существует? - PullRequest
3 голосов
/ 10 января 2012

Я пытался получить второе по величине значение из массива, и я просто хочу знать, возможно ли сделать что-то вроде MAX -1 ИЛИ Мне абсолютно необходимо отсортировать по таблице и второму по величине значению

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

Ответы [ 6 ]

6 голосов
/ 10 января 2012

Кажется, что нет такой стандартной функции (она слишком специфична).
Вы можете отсортировать и получить второе значение, но это 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;
}
2 голосов
/ 10 января 2012
 $a = Array ( 1, 2, 40 , 100);
 echo max($a) - 1; // definitely not 40

Так что да, вам нужно rsort() ( встроенная функция PHP, сначала отсортировать массив с самыми высокими значениями ), а затем взять второе значение из списка.

Обратите внимание, что, например, array( 1 , 10 , 5 , 10 ) имеет второе значение == первое значение; если вам нужно второе по величине уникальное значение, сначала введите array_unique().

0 голосов
/ 10 января 2012

max($array) - 1 не собирается работать. Я бы сделал что-то вроде:

$array = arsort($array);
return isset( $array[1] ) ? $array[1] : FALSE;
0 голосов
/ 10 января 2012
sort( $array, SORT_NUMERIC );
echo $array[ count( $array ) - 2 ];
0 голосов
/ 10 января 2012

Лучший способ - использовать алгоритм qsort (более читаемый код, меньше отладки).Если ваш массив / таблица очень велик (и, следовательно, qsort может создать разумную проблему с производительностью для вашего кода), вы, вероятно, можете выполнить линейный поиск с сохранением в 2 переменных элементов «max» и «max-1»: не слишком дорогочтобы сделать, но вам нужно понять, может ли эта работа дать вам реальное преимущество.

Другой подход - попытаться сохранить отсортированный массив непосредственно в его источнике (таблица SQL / DB).

0 голосов
/ 10 января 2012

Не думаю, что вы найдете функцию MAX - 1. Вероятно, нужно сделать тип сортировки, а затем занять вторую позицию в отсортированном массиве.

...