PHP介绍如何将数组中的值自动组合为给定的和
我想对数组中的值求和,以匹配给定和数的最近答案PHP介绍如何将数组中的值自动组合为给定的和,php,arrays,for-loop,multidimensional-array,sum,Php,Arrays,For Loop,Multidimensional Array,Sum,我想对数组中的值求和,以匹配给定和数的最近答案 下面的场景/示例提供了1-5项,将每个值加总到200(最小值) 如果两个值的组合为200,则返回键 最多3个项目的组合。给定4个项目,如果2个项目的组合为205,而其他组合为210,则选择前2个组合 我已经阅读和学习了许多PHP资源,但没有一个我可以轻松地完全理解如何解决我的PHP应用程序的问题 给出如下两个表,如果我更改逻辑运算符,我的编码只能对其中任何一个起作用 如何使编码同时适用于两者。请指出我的编码错误,并为我提出解决方案 表A: It
- 下面的场景/示例提供了1-5项,将每个值加总到200(最小值)李>
- 如果两个值的组合为200,则返回键李>
- 最多3个项目的组合。给定4个项目,如果2个项目的组合为205,而其他组合为210,则选择前2个组合
Item | Name | Price
----- ------------ --------
1 | Adidas | 190.00
2 | Nike Run | 170.00
3 | Puma | 110.00
4 | Nike Women | 30.00
上表A的工作代码:
$values = [
1=>320;
2=>50;
3=>120;
4=>10;
5=>30;
];
echo implode(',', getKeys($values,200));
function getKeys($array, $min, $keys=array())
{
// Select the smallest value that less than given value.
if(empty($keys)){
$keep[] = array(0,0);
foreach($arrays as $key=>$value){
$keep[1] = isset($keep[1]) ? $keep[1] : null;
if($value <= $min && $value > $keep[1] ){
$keep[0]=$key;
$keep[1]=$value;
break 1;
}else{
//$keep[0]=$key;
$keep[1]=$value;
}
}
$keys[] = $keep[0];
}
$total = 0;
foreach($keys as $key){
if(!empty($arrays)){
$total += $arrays[$key];
}
}
if($total >= $min){
$keep[] = array(0,0);
$keep[1] = $total;
foreach($arrays as $key=>$value){
if($value >= $min && $value < $keep[1] && !in_array($key, $keys)){
$keep[0]=$key;
$keep[1]=$value;
break 1;
}
}
if($total <= $keep[1]){
if(count($keys) > 3){
//Restricted only 3 keys to be return, remove smallest value
$keep[] = array(0,0);
foreach($arrays as $key=>$value){
$keep[1] = isset($keep[1]) ? $keep[1] : null;
if($value <= $min && $value < $keep[1]){
$keep[0]=$key;
$keep[1]=$value;
break 1;
}else{
$keep[0]=$key;
$keep[1]=$value;
}
}
for($z = 0; $z < count($keys); $z++){
if($keys[$z] == $keep[0]){
unset($keys[$z]);
}
}
return $this->getCamp1($array, $min, $keys);
}else{
sort($keys);
return $keys;
}
}else{
unset($keys);
$keys[] = $keep[0];
return $this->getKeys($array, $min, $keys);
}
}else{
// Select the next value that can exceed min
if(!empty($keys)){
$next = NULL;
$arrays = array_keys($array);
foreach($arrays as $key=>$value){
if($value < $min && ($value + $total) >= $min && !in_array($key,$keys)){
$next=$key;
break 1;
}
}
}
if(empty($next)){
// Pick the next biggest value that less than minimum value ($200)
$keep[] = array(0,0);
$counterCamp = count($array);
foreach($arrays as $key=>$value){
$keep[1] = $min;
if($value < $min && $value < $keep[1] && !in_array($key, $keys)){
$keep[0]=$key;
$keep[1]=$value;
break 2;
}else{
$keep[1]=$value;
}
$counterCamp--;
}
// Reselect value more than 200
if($counterCamp == 0){
foreach($arrays as $key=>$value){
if($value > $min && $value < $keep[1] && !in_array($key, $keys)){
$keep[0]=$key;
$keep[1]=$value;
unset($keys);
break 2;
}else{
$keep[0]=$key;
$keep[1]=$value;
unset($keys);
break 2;
}
}
}
$keys[] = $keep[0];
return $this->getKeys($array, $min, $keys);
}else{
$keys[] = $next;
return $this->getKeys($array, $min, $keys);
}
}
}
除非更新以下编码,否则下表B不起作用
表B:
Item | Name | Price
----- ------------ --------
1 | Adidas | 90.00
2 | Nike Run | 180.00
3 | Puma | 15.00
4 | Nike Women | 25.00
上表B的工作代码:
// Select the smallest value that less than given value.
if(empty($keys)){
$keep[] = array(0,0);
foreach($arrays as $key=>$value){
$keep[1] = isset($keep[1]) ? $keep[1] : null;
if($value <= $min && $value < $keep[1] ){
$keep[0]=$key;
$keep[1]=$value;
break 1;
}else{
//$keep[0]=$key;
$keep[1]=$value;
}
}
$keys[] = $keep[0];
}
// Select the smallest value that less than given value.
if(empty($keys)){
$keep[] = array(0,0);
foreach($arrays as $key=>$value){
$keep[1] = isset($keep[1]) ? $keep[1] : null;
if($value <= $min && $value < $keep[1] ){
$keep[0]=$key;
$keep[1]=$value;
break 1;
}else{
//$keep[0]=$key;
$keep[1]=$value;
}
}
$keys[] = $keep[0];
}
Item | Name | Price
----- ------------ --------
2 | Nike Run | 180.00
4 | Nike Women | 25.00