2014-02-26 37 views
4

用户请求产品类别并说明他们需要的数量,即糖7磅。PHP数据处理因模糊错误而失败

在搜索结果中,从数据库中,我有以下的项目(其各自不同的产品):

糖,8盎司0.75

糖,1磅1.50

糖,2磅4.00

糖,5磅7.00

糖,10磅11.00

当前进程:

  • 获取搜索结果
  • 检查然而,对于结果的一个结果(仅10磅就满足吧)或其倍数的任何一个(最便宜的选择许多1需要匹配的标准,所以7 X 1磅)
  • 把单个产品ID放入一个数组
  • 获得1:1排列,但在其中,使用一些代码添加多达3个重复(因为5磅+ 2 X 1磅是最便宜的选择N,不是5磅+ 2磅)
  • 在此,检查不同的数量单位(盎司VS磅),能够转换和比较
  • 的比较最便宜,最便宜的回报
  • 我甚至不顾地方有在置换超过6元剔除掉不太可能的选项,并减少开销

除非有> 9个产品ID(对于一些我有> 25)这工作得很好,然后我获取日志中的这个错误(以及浏览器中完全不相关的错误):脚本标题的提前结束

这是很多代码。我很抱歉,只想彻底!有没有更高效/更有效的方法?

function processCombos($arr, $qty_search, $qty_unit_search){ //$arr is the dataset, $qty_search is 7, $qty_unit_search is 1 for lbs 
    $combo=array(); 
    $pid_arr = arrayifyProductIDs($arr); 
    $count = count($pid_arr); 
    $members = pow(2,$count); 

    for ($i = 0; $i < $members; $i++) { 
     $b = sprintf("%0".$count."b",$i); 
     $out = array(); 
     for ($j = 0; $j < $count; $j++) { 
     if ($b{$j} == '1'){ 
      $out[] = $pid_arr[$j]; 
     } 
     } 

     $minLength=2; 
     $out_max = count($out); 
     if ($out_max >= $minLength) { 
     // now add in different repeats of each of them 
     $repeat_max = 3; 
     $indiv = array(); 

     for($k=0;$k<$out_max;$k++){ 
      $tmp = array(); 
      for ($r = 0; $r < $repeat_max; $r++) $tmp[$r] = array_fill(0, $r + 1, $out[$k]); 
      $indiv[] = $tmp; 
     } 

     $x_ct = count($indiv[0]); 
     $y_ct = count($indiv[1]); 
     $z_ct = count($indiv[2]) > 0 ? count($indiv[2]): 0; 
     $perm = array(); 
     for($x=0;$x<$x_ct;$x++){ 
      for($y=0;$y<$y_ct;$y++){ 
       if($z_ct > 0){ 
        for($z=0;$z<$z_ct;$z++){ 
        $perm = array_merge($indiv[0][$x],$indiv[1][$y],$indiv[2][$z]); 
        } 
       }else{ 
        $perm = array_merge($indiv[0][$x],$indiv[1][$y]); 
       } 

       $p=0; 
       $max_p=count($perm); 
       if($max_p >=7){ 
       }else{ 
       $product_ids = array(); 
       $qty = 0; 
       $price = 0; 
       while($p < $max_p){ 
        $product_id = $perm[$p]; 
        $data = $arr[$product_id]; 
        if(!$data['qty_unit_id'] OR !$data['qty']){continue;} // go to the next one if it doens't have qty or qty_unit 
        if($data['qty_unit_id'] == $qty_unit_search){ 
        $product_ids[] = $product_id; 
        $qty += $data['qty']; 
        $price += $data['price']; 
        }else{ 
        $unit_to_convert_data = getQtyUnitName($qty_unit_search); 
        $unit_to_convert = $unit_to_convert_data['abbr']; 
        $unit_to_convert_type = $unit_to_convert_data['conv_file']; 
        if($unit_to_convert_type == $data['conv_file']){ 
         if($data['conv_file'] == "Mass"){ 
          $product_conv = new PhpUnitsOfMeasure\PhysicalQuantity\Mass($data['qty'], $data['qty_unit']); 
         }else{ 
          $product_conv = new PhpUnitsOfMeasure\PhysicalQuantity\Volume($data['qty'], $data['qty_unit']); 
         } 

         $data['qty_CONV'] = number_format($product_conv->toUnit($unit_to_convert),3,".",","); 

         $product_ids[] = $product_id; 
         $qty += $data['qty_CONV']; 
         $price += $data['price']; 
        } 
        } 
        $p++; 
        } 
     if(count($combo)==0 AND $qty >= $qty_search){ 
     $combo = array('product_ids' => $product_ids, 'qty' => $qty, 'price' => $price); 
     }elseif(($qty >= $qty_search AND $price < $combo['price']) OR 
      ($qty >= $qty_search AND $price == $combo['price'] AND $qty > $combo['qty'])){ 
     $combo = array('product_ids' => $product_ids, 'qty' => $qty, 'price' => $price); 
     }else{ 
     } 
     }/// i think it should go here 
       } 
      } 

     } 
     } 

    return $combo; 
} 
+0

嗯,在那个列表中,我们可以从理论上[直接丢弃1lb&2lb,直接在我们的解决方案中](http://en.wikipedia.org/wiki/Knapsack_problem#Dominance_relations),因为0.75磅的0.75可以合并到2个相同或更少价钱。你想这样做,还是有一个优势(额外维度),应该更喜欢更大的包装?我们是否应该找到平等的“最佳”解决方案,然后选择最少数量的解决方案? – Wrikken

+0

@Wrikken更大的包装是最佳的,所有其他因素相同。这是在包含代码的最终if/elseif中处理的。也许为了节省时间/资源,我可以开始排除过大的数量,即10磅的产品?!? –

回答

2

Premature end of script headers通常意味着你的脚本发送头到Web服务器之前,由于在httpd.conf RLimitCPURLimitMEM指示资源限制杀害。要么改变这些指令,以允许更多的CPU和内存给你的应用程序或写出更有效的代码(3代表循环意味着处理记录^ 3倍块内部,考虑重写它。)

+0

我有一个更清洁的解决方案,它将单个数组中的所有排列加载,然后在一个循环中处理(比较数量和价格数据),但它超出了我共享主机上的内存(124MB,我相信)。对更有效的解决方案有任何想法?谢谢! –