资讯专栏INFORMATION COLUMN

给定总数,给定供给组数,获取最理性的平均值

whlong / 2679人阅读

摘要:我要获得尽可能理想的数据,那么应该分别返回条。我总共需要条数据,数据库中满足条件的有类数据,他们总数分别是条。上面的代码就实现了这一目的。

话不多说,上代码,不懂原理与目的可以对照注释
/**
 * 根据给定的总数值返回每个单元的最值平均数
 *
 * @param integer $num 总共需要被平均的值
 * @param array   $data 提供的数据
 *
 * @example $num  = 12
 *           $data = [
 *                  "a" => 5,
 *                  "b" => 6,
 *                  "c" => 2,
 *                 ]
 *
 * @return [
 *          "a" => 5,
 *          "b" => 5,
 *          "c" => 2,
 *          ]
 */
if (! function_exists("get_avg_data")) {
    function get_avg_data($num, array $data)
    {
        $sum = array_sum($data);
        // 如果数组内小于需要数值
        if ($num >= $sum){
            $reData = $data;
        } else {
            asort($data);
            $reData = handle_avg_data($num, $data);
        }

        return $reData;
    }
}

// 处理数据
if (!function_exists("handle_avg_data")){
    function handle_avg_data(&$num, array &$data)
    {
        $n = count($data);
        $avg = (int)($num / $n);
        $y = $num % $n;
        $reData = [];
        $preData = $data;
        foreach ($data as $key => $value) {
            if ($value <= $avg){
                $reData[$key] = $value;
                unset($data[$key]);
                $num = $num - $value;
            }
        }
        if (count($preData) == count($data)){
            if ($y == 0){
                foreach ($data as $k => $v){
                    $reData[$k] = $avg;
                    unset($data[$k]);
                }
            } else {
                foreach ($data as $k => $v){
                    $reData[$k] = $avg + 1;
                    $num = $num -  $avg - 1;
                    unset($data[$k]);
                    break;
                }
            }
        }
        $reD = [];
        if (count($data) > 0){
            $reD = handle_avg_data($num, $data);
        }

        return array_merge($reData, $reD);
    }
}
好吧,再举一个例子

eg①:我总共需要30条数据,数据库中满足条件的有4类数据,他们总数分别是4,5,15,19条。
我要获得尽可能理想的数据,那么应该分别返回 4,5,11,10条。
eg②:我总共需要30条数据,数据库中满足条件的有4类数据,他们总数分别是12,6,15,19条。
我要获得尽可能理想的数据,那么应该分别返回 8,6,8,8条。
……

上面的代码就实现了这一目的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28307.html

相关文章

  • 【整理】Laravel 中Eloquent ORM 相关操作

    摘要:软删除当模型被软删除后,它们并没有真的从数据库删除,而是在模型上设置一个属性并插入数据库,如果模型有一个非空值,那么该模型已经被软删除了。 Laravel 中Eloquent ORM 相关操作 定义 操作 获取(查询) 获取集合,(查询列表) 返回值是 IlluminateDatabaseEloquentCollection 的一个实例 获取所有的数据 use AppUser; $us...

    dongfangyiyu 评论0 收藏0
  • 你可能需要了解下Laravel集合

    摘要:前言集合通过进行实例,的内核大部分的参数传递都用到了集合,但这并不代表集合就是好的。当你需要处理一组数组时,你可能就需要它帮助你快捷的解决实际问题。例如我们需要通过一个水平线切分数组,将其分为个及以上的数组个数。谢谢,还不抓紧去练习下集合 showImg(https://segmentfault.com/img/bVbhjvY?w=600&h=296); 前言 集合通过 Illumin...

    fuyi501 评论0 收藏0
  • 使用 Prometheus 监控 Docker 容器

    摘要:传统方法比如说你想监控你容器的内存使用率。不支持维度数据,这样一个名为的容器的指标,可能被称为。这是非常伟大并且有用的,但是有限制性。这个输出器使用容器的名字,和镜像作为维度。 本文的原作者是 johannes-fish-ziemke,原文地址是 http://5pi.de/2015/01/26/monitor-docker-containers-with-prometheus/...

    big_cat 评论0 收藏0

发表评论

0条评论

whlong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<