我需要一种类似于测试条件的for循环重新评估行为的算法

时间:2019-02-22 01:13:54

标签: php algorithm logic

我正在迭代放置在容器中的一系列盒子。例如,一个容器可以存储“ 10”级的盒子。如果数组为[6,5,2]。我将有两个容器:一个包含[6,2]和一个包含[5],对数组进行了迭代,它抓住了6,跳过了5,抓住了2。由于6 + 5为11,所以跳过了5。容器不能有更多容器而不是10级。跳过的5将放置在单独的数组中,以便稍后进行迭代。

下面我总结我的问题。这不是工作代码。我只是在讲我的问题。

$boxes = [2, 3, 2, 5, 8, 2, 10, 2, 5, 6]; // my boxes

$separated_boxes = [];
$items = [];

for($i = 0; $i < count($boxes); $i++){

 $items[] = $box[$i]; //add box to array

  $result = Class::packBoxes($items) // check if the box(es) can be packed

 //if the current box cannot be packed it is separated
  if($result == false)
  {
     $separated_boxes[] = $box[$i];
  }

   //if the loop reaches the end a new loop should start with the separated boxes

//Apparently I cannot do this because the for conditions are avalidated only once

    if((($i + 1) == count($boxes) && count($separated_boxes) > 0)){

               $itens = [];
                $i = 0;
                $boxes= $separated_boxes;
                $separated_boxes= [];
       }
 }

   packBoxes($boxes)
{
  if(canPack($box)
   {
      return true;
   }
   else{
       return false;
   }
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您正在考虑使用错误的循环方式。类似于for的循环通常用于对输入一次中的每个项目执行某项操作。

但这不是您所需要的。您需要反复检查输入 中的项目,将它们放在一旁再找回来,直到所有项目都分发到容器中为止。

有很多方法可以编写此代码(循环,迭代器,递归函数,带有逻辑的对象...)。在循环方面,您可以像这样尝试do-while

do {

  // take items out of $boxes until you fill <=10 units container

} while( ! empty( $boxes ) );