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个组合
我已经阅读和学习了许多PHP资源,但没有一个我可以轻松地完全理解如何解决我的PHP应用程序的问题

给出如下两个表,如果我更改逻辑运算符,我的编码只能对其中任何一个起作用

如何使编码同时适用于两者。请指出我的编码错误,并为我提出解决方案

表A:

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