我想总结数组中的值以匹配给定总和数的最近答案。
我已从许多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);
}
}
}
预期结果:
Item | Name | Price
----- ------------ --------
2 | Nike Run | 170.00
4 | Nike Women | 30.00
除非在编码后进行更新,否则表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];
}
期望的结果:
Item | Name | Price
----- ------------ --------
2 | Nike Run | 180.00
4 | Nike Women | 25.00