## 帮帮看看这段代码，帮忙优化下？

maudo 发布于 2016/09/18 19:47

`\$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
];```

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

0

```<?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

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