Получить минимальное и максимальное значение в массиве PHP

У меня есть такой массив:


array (0 => 
  array (
    'id' => '20110209172713',
    'Date' => '2011-02-09',
    'Weight' => '200',
  ),
  1 => 
  array (
    'id' => '20110209172747',
    'Date' => '2011-02-09',
    'Weight' => '180',
  ),
  2 => 
  array (
    'id' => '20110209172827',
    'Date' => '2011-02-09',
    'Weight' => '175',
  ),
  3 => 
  array (
    'id' => '20110211204433',
    'Date' => '2011-02-11',
    'Weight' => '195',
  ),
)

Мне нужно извлечь минимальное и максимальное значения веса. В этом примере

$мин_значение = 175

$max_value = 200

Любая помощь в том, как это сделать? Спасибо !


person Peter    schedule 01.05.2011    source источник
comment
Я начинаю думать, что PHP нужен новый позиционный оператор со всеми недавними вопросами, касающимися прямого доступа к индексам двумерного массива...   -  person Alix Axel    schedule 01.05.2011
comment
array_pluck и array_column были предложены (примерно 7 лет назад). Я не жду ничего подобного в ближайшее время. И еще один здесь.   -  person Rudie    schedule 21.01.2013


Ответы (5)


Вариант 1. Сначала вы сопоставляете массив, чтобы получить эти числа (а не полную информацию):

$numbers = array_column($array, 'weight')

Затем вы получаете мин и макс:

$min = min($numbers);
$max = max($numbers);

Вариант 2. (Только если у вас не PHP 5.5 или выше) То же, что и вариант 1, но для извлечения значений используйте array_map:

$numbers = array_map(function($details) {
  return $details['Weight'];
}, $array);

Вариант 3.

Вариант 4. Если вам нужен только минимум ИЛИ максимум, array_reduce() может быть быстрее:

$min = array_reduce($array, function($min, $details) {
  return min($min, $details['weight']);
}, PHP_INT_MAX);

Это делает больше min()s, но они очень быстрые. PHP_INT_MAX должен начинаться с максимума и опускаться все ниже и ниже. Вы можете сделать то же самое для $max, но вы должны начать с 0 или -PHP_INT_MAX.

person Rudie    schedule 01.05.2011
comment
Варианты 1 и 3 кажутся идентичными? - person Pang; 31.05.2017
comment
@Pang Ты прав. Они были не всегда, но теперь они есть. - person Rudie; 31.05.2017


Интересно отметить, что оба приведенных выше решения используют дополнительное хранилище в виде массивов (в первом два из них, а во втором используется один массив), а затем вы находите минимальное и максимальное значение, используя массив «дополнительного хранилища». Хотя это может быть приемлемо в реальном мире программирования (кому какое дело до «лишней» памяти?), это дало бы вам «C» по программированию 101.

Проблема нахождения минимума и максимума может быть легко решена с помощью всего двух дополнительных слотов памяти.

$first = intval($input[0]['Weight']);
$min = $first ;
$max = $first ;

foreach($input as $data) {
    $weight = intval($data['Weight']);

    if($weight <= $min ) {
        $min =  $weight ;
    }

    if($weight > $max ) {
        $max =  $weight ;
    }

}

echo " min = $min and max = $max \n " ;
person rjha94    schedule 01.05.2011
comment
Вы можете заменить if($weight > $max ) { на if($weight >= $max ) {, чтобы гарантировать, что $max всегда будет иметь $weight. - person Lucas; 12.01.2020

Как насчет того, чтобы не использовать предопределенную функцию, например min или max?

$arr = [4,5,6,7,8,2,9,1];
$val = $arr[0];
$n = count($arr);

for($i=1;$i<$n;$i++) {
if($val<$arr[$i]) {
    $val = $val;        
} else {
    $val = $arr[$i];
}
}
print($val);

?>

person Sambhav Pandey    schedule 10.09.2016

печатать быстро пять максимальных и минимальных чисел из массива без использования массива сортировки в php: -

<?php  

$array = explode(',',"78, 60, 62, 68, 71, 68, 73, 85, 66, 64, 76, 63, 81, 76, 73,  
68, 72, 73, 75, 65, 74, 63, 67, 65, 64, 68, 73, 75, 79, 73");  
$t=0;  
$l=count($array);  
foreach($array as $v)  
{  
 $t += $v;  
}  
 $avg= $t/$l;  
 echo "average Temperature is : ".$avg."  ";   


echo "<br>List of seven highest temperatsures :-"; 
$m[0]= max($array); 
for($i=1; $i <7 ; $i++)
{ 
$m[$i]=max(array_diff($array,$m));
}
foreach ($m as $key => $value) {
    echo "  ".$value; 
}
echo "<br> List of seven lowest temperatures : ";
$mi[0]= min($array); 
for($i=1; $i <7 ; $i++)
{ 
$mi[$i]=min(array_diff($array,$mi));
}

foreach ($mi as $key => $value) {
    echo "  ".$value; 
}
?>  
person dhavaloza    schedule 17.01.2017