【问题标题】:how to get maximum value from array php如何从数组php中获取最大值
【发布时间】:2017-01-10 05:01:06
【问题描述】:

如何获得与下面数组的最大距离?当我尝试 print_r($data) 时,我得到以下输出:

Array
(
    [0] => Array
        (
            [distance] => 1.7 km
            [time] => 3 mins
            [distance_value] => 1720
            [time_value] => 192
        )

    [1] => Array
        (
            [distance] => 4.2 km
            [time] => 10 mins
            [distance_value] => 4207
            [time_value] => 587
        )

)

我想回显 4.2 公里,因为它是我阵列中的最大距离。

foreach ($delivery as $key => $value) {
    if($key==0) {
        $mysource = $pickup;
    } else {
        $mysource = $delivery[$key-1];
    }
    $data[$key] = $this->GetDrivingDistance($mysource,$value);
    if(!empty($data[$key])) {
        $dist += max($data[$key]['distance']); 
    }
}
echo $dist; exit();
print_r($data); exit();

【问题讨论】:

  • 你只想找到最大距离??
  • 这个值是 1.7 公里还是 1.7 ?
  • @所有回答者,请注意4.2 km 是一个字符串,而不是浮点数。盲目转换会产生不可预知的结果!您需要先适当地转换它。看看我的answer
  • @Thamilan 只需使用distance_value 进行排序。据我所知,它包含以米为单位的“距离”作为整数。

标签: php cakephp


【解决方案1】:

您可以使用内置函数:

echo max(array_map('floatval',array_column($array, "distance")))." km";

说明:

  • array_column - 将您的数组转换为一维数组
  • array_map - 对字符串应用浮动操作。这很重要,因为您的字符串比较错误地比较了两个数字。应用浮动功能时,您的 km 将被删除,因此请稍后添加。

字符串示例:

11.7小于4.2,因为它比较第一个字符并按1,2,3排列...


输出:

4.2 km

注意: 如果所有值都在 km 中,这是合适的,如果它在其他单位中,您也需要解决方法!

【讨论】:

    【解决方案2】:
    <?php
    
    $array = array
    (
         array
            (
                "distance" => "1.7 km",
                "time" => "3 mins",
                "distance_value" => 1720,
                "time_value" => 192,
            ),
    
            array
            (
                "distance" => "4.2 km",
                "time" => "10 mins",
                "distance_value" => 4207,
                "time_value" => 587,
            )
    );
    
    $distance = [];
    $i = 0;
    foreach ($array as $distance_data) {
        $distance[] = (float)$distance_data["distance"];
        $i++;
    }
    $max_distnace = max($distance);
    var_dump($max_distnace);
    

    【讨论】:

    • 你确定你用动态值测试过你的代码吗?
    【解决方案3】:

    可以先将数组按距离排序,得到需要的:

    $myArray = 
    array (
        array
            (
                'distance' => '1.7 km',
                'time' => '3 mins',
                'distance_value' => 1720,
                'time_value' => 192,
            ),
        array
            (
                'distance' => '4.2 km',
                'time' => '10 mins',
                'distance_value' => 4207,
                'time_value' => 587,
            )
    
    );
    
    usort($myArray,function($a, $b) {
     return $b['distance_value'] - $a['distance_value'];
    });
    
    $maxDistance = $myArray[0];
    
    echo $maxDistance['distance'];
    // 4.2 km
    

    【讨论】:

    • 如果逆向排序比较,则不需要array_reverse usort($data, function ($a, $b){ return $b['distance_value'] - $a['distance_value'];});echo $data[0]['distance'];。这里是a demo
    • 你确定你用动态值测试过你的代码吗?
    • distancedistance_value 保持相同的值。使用distance_value 来比较我认为更稳定的方式。此代码经过测试。
    【解决方案4】:

    我从下面的代码中得到解决方案..

    foreach ($delivery as $key => $value) {
                            if($key==0){
                                $mysource = $pickup;
                            }else{
                                $mysource = $delivery[$key-1];
                            }
                            $data[$key] = $this->GetDrivingDistance($mysource,$value);
                            if(!empty($data[$key])){
                                $max = '-9999999 km'; //will hold max val
                                $found_item = null; //will hold item with max val;
                                foreach($data as $k=>$v)
                                {   
                                    if($v['distance']>$max)
                                    {
                                       $max = $v['distance'];
                                       $found_item = $v;
                                    }
                                }                           
                            }
                        } 
                        $dist = $max;
    

    【讨论】:

      【解决方案5】:

      Thamilan's answer 是最好的,但是当您使用 CakePHP 时,如果您无法使用 array_column(),您也可以使用 Hash::extract()您使用的是旧版本PHP 的)或者如果您需要使用具有更深关联的数组,这要归功于 Hash 实用程序的路径语法:-

      echo max(array_map('floatval', Hash::extract($array, 'distance'))) . ' km';
      

      这里Hash::extract() 的工作方式与array_column() 类似,并将您的数组转换为一维数组。

      【讨论】:

        【解决方案6】:

        尽管这个问题是用 CakePHP 标记的,但我会使用 CakePHP Collection class 给出我的解决方案:

        use Cake\Collection\Collection;
        (new Collection($data))->sortBy('distance_value')->first()['distance'];
        

        请注意,CakePHP 有一个实用函数 collection 可以缩短此时间:

        collection($data)->sortBy('distance_value')->first()['distance']
        

        【讨论】:

          猜你喜欢
          • 2011-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-16
          • 1970-01-01
          • 2019-09-19
          • 1970-01-01
          相关资源
          最近更新 更多