帮帮看看这段代码,帮忙优化下?

maudo 发布于 2016/09/18 19:47
阅读 433
收藏 0
PHP
一个用户ID的数组
$uids = [1,2,3,5,6,8,9,11,13,25,65];

这个数组的每一个键值代表一个UID

金额数组

$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];



此数组的键名和$uid数组的键值对应。
循环$uids这个数组,取出对应的金额$amount,
如果这个金额大于等于12000($boundary),就在总金额($totals)加上这个$amount
如果这个金额小于12000,就再向下循环,循环到这几个$amount相加大于等于12000,然后在总金额($totals)加上这几个$amount的和
最多取三层。
最后得出$totals的值。
我现在的代码:

<?php
$boundary = 12000;
$uids= [1,2,3,5,6,8,9,11,13,25,65];
$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];
$totals = 0;
foreach($uids as $k => $uid){
    $amont = $amounts[$uid];
    if($amont >= $boundary){
        $totals += $amont;
    }else{
        $next = get_next($uids ,$k+1 ,$amont);
        if($next && is_array($next)){
            $curKey = $next[0]; //amouts index 3
            $totals+=$next[2];
            //再向下获取一层
            $nextKey = $curKey+1;
            if(!isset($uids[$nextKey])){
                break;
            }
            $nextUid = $uids[$nextKey];
            $nextAmount = $amounts[$nextUid];
            if($nextAmount >= $boundary){
                $totals+=$nextAmount;
            }else{
                $last = get_next($uids ,$nextKey+1 ,$nextAmount);
                if($last && is_array($last)){
                    $totals+=$last[2];
                }
            }
        }
        break; //跳出主循环
    }
}
echo $totals;
exit;

function get_next($uids ,$start ,$prevAmount){
    global $amounts ,$boundary;
    $leaves = array_slice($uids ,$start ,count($uids),true);
    if($leaves){
        foreach($leaves as $k=>$uid){
            $amount = $prevAmount+$amounts[$uid];
            if($amount >= $boundary){
                return [$k ,$uid ,$amount];
                break;
            }else{
                return get_next($uids ,$k+1 ,$amount);
            }
        }
    }
    return 0;
}



得出$totals=47500



加载中
0
inuxor
inuxor

明确一下,是不是这个意思

<?php
$boundary = 12000;
$uids= [1,2,3,5,6,8,9,11,13,25,65];
$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];
$i = 0;
$tmp = 0;
$total = 0;
foreach ($amounts as $key => $value) {
    $tmp += $value;
    if($tmp >= $boundary){
        $total += $tmp;
        $tmp = 0;
        $i++;
    }
    if($i == 3){
        break;
    }
}

echo $total;



m
maudo
就是这意思,谢谢
0
沙枣
沙枣
#!newlisp

(let (@array '(1 2 3 5 6 8 9 11 13 25 65))
      @hash '((1 12000) (2 500) (3 11000) ...)
  (apply '+ (map (fn (x) (if (> x 11000) 0 (lookup x @hash))) @array)))



沙枣
沙枣
newLISP
两说
两说
python?
0
李落雨
李落雨
最多取3层是什么意思?
返回顶部
顶部