在PHP数组中获取最小值和最大值

49
我有这样一个数组:

数组 (0 => 
  数组 (
    'id' => '20110209172713',
    '日期' => '2011-02-09',
    '体重' => '200',
  ),
  1 => 
  数组 (
    'id' => '20110209172747',
    '日期' => '2011-02-09',
    '体重' => '180',
  ),
  2 => 
  数组 (
    'id' => '20110209172827',
    '日期' => '2011-02-09',
    '体重' => '175',
  ),
  3 => 
  数组 (
    'id' => '20110211204433',
    '日期' => '2011-02-11',
    '体重' => '195',
  ),
)

我需要提取最小值和最大值的权重值。 在这个例子中

$min_value = 175

$max_value = 200

请帮忙指导如何实现? 谢谢!


我开始认为PHP需要一个新的位置操作符,因为最近关于“直接”访问二维数组索引的问题很多。 - Alix Axel
1
array_pluckarray_column已经在7年前被建议使用。我不指望很快会有类似的东西出现。这里还有一个链接 - Rudie
9个回答

119

选项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()函数,但它们非常快速。使用PHP_INT_MAX可以从高到低开始,并且不断减小。你也可以对$max执行相同的操作,但你需要从0-PHP_INT_MAX开始。


16
foreach ($array as $k => $v) {
  $tArray[$k] = $v['Weight'];
}
$min_value = min($tArray);
$max_value = max($tArray);

11
对于使用PHP 5.5+的人来说,可以通过array_column更轻松地完成这个操作。不再需要那些丑陋的array_maps了。
如何获取最大值:
$highest_weight = max(array_column($details, 'Weight'));

如何获取最小值
$lowest_weight = min(array_column($details, 'Weight'));

8
有趣的是,以上两种解决方案都使用了额外的存储形式——数组(第一种方法使用了两个,第二种方法使用了一个),然后使用“额外存储”数组查找最小值和最大值。虽然在实际编程世界中这可能是可以接受的(谁在意“额外”存储?),但在编程101中可能只能得到“C”的评分。
找到最小值和最大值的问题可以很容易地用两个额外的内存槽来解决。
$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 " ;

1
您可能想要将 if($weight > $max ) { 替换为 if($weight >= $max ) { 以确保 $max 总是有一个 $weight - Lucas

3

如果不使用预定义函数,例如 minmax ,该怎么办呢?

    //find max 
     $arr = [4,5,6,1];
        $val = $arr[0];
        $n = count($arr);
        for($i=0;$i<$n;$i++) {
        if($val < $arr[$i]) {
            $val = $arr[$i];
        }
        }
        echo $val;


     //find min 
     $arr = [4,5,6,1];
        $val = $arr[0];
        $n = count($arr);
        for($i=0;$i<$n;$i++) {
        if($val > $arr[$i]) {
            $val = $arr[$i];
        }
        }
        echo $val;

0
$Location_Category_array = array(5,50,7,6,1,7,7,30,50,50,50,40,50,9,9,11,2,2,2,2,2,11,21,21,1,12,1,5);

asort($Location_Category_array);
$count=array_count_values($Location_Category_array);//Counts the values in the array, returns associatve array
        print_r($count);
        $maxsize = 0;
        $maxvalue = 0;
        foreach($count as $a=>$y){
            echo "<br/>".$a."=".$y;
            if($y>=$maxvalue){
                $maxvalue = $y;
                if($a>$maxsize){
                    $maxsize = $a;
                }
            }
        }

    echo "<br/>max = ".$maxsize;

这并不代表提问者的多维数据。 - mickmackusa

0
$num = 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'));

    foreach($num as $key => $val)   
    {                       
        $weight[] = $val['Weight'];
    }

     echo max($weight);
     echo min($weight);

0
<?php 
$array = 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',
  ),
);

foreach ($array as $key => $value) {
  $result[$key] = $value['Weight'];
}
$min = min($result);
$max = max($result);

echo " The array in Minnumum number :".$min."<br/>";
echo " The array in Maximum  number :".$max."<br/>";
?> 

0

在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; 
}
?>  

这并不代表提问者的多维数据。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接