按大小和倍数对列表中的项目进行分组

时间:2014-01-24 23:23:16

标签: php arrays sorting

我正在尝试自动化我们在工作中所做的事情。我得到了20多个组织的名单,以及他们拥有的客人数量。然后我给他们分配表号。每张桌子可容纳8人。所以首先我指定八倍的公司,然后我开始根据大小对其余公司进行分组。

从概念上讲,我该怎么做。我最初的想法是创建一个具有组织名称和大小的数组。然后添加一个MOD为8的列。然后对数组中每个具有mod 1的项目执行a并查找是否有一个mod 7.除了我不知道如何比较它们,并且模糊从数组中删除它们,我把所有时间花在SQL上,很少使用数组。提前致谢。

2 个答案:

答案 0 :(得分:0)

<?

$companies = array(
  'GE' => 42,
  'ATT' => 38,
  'Chevy' => 11
);

foreach($companies as $name => $qty){
  echo "$name: \n";
  $tables = $qty/8;
  $totals = explode('.',$tables);
  $extras = (intval($totals[1])/100)*8;
  if($extras>8) $extras = $extras/10;
  echo "$totals[0] plus {$extras} extra. <br>\n";
}

?>

GE:5加2加。

ATT:4加6加。

雪佛兰:1加3加。

现在我想唯一的问题是哪里是我该死的饼干。 :)

答案 1 :(得分:0)

我认为用户注意某些请求的复杂性非常重要。如果我不喜欢这种特殊的运动,我就不会花时间把它扔在一起。

假设你有一个这样的数据数组:

<?php
$companies = array(  
  'Verizon' => 75,  
  'GE' => 42,
  'JP Morgan' => 38,
  'ATT' => 38,
  'Chevy' => 11,
  'Gray' => 4,
  'Individuals' => 0
);
?>

您将执行此脚本:

<?php function completeList($companies,$table_size){echo "<table>\n";echo "<tr><th>Company</th><th>Total</th></tr>\n";foreach($companies as $c=>$q){echo "<tr><td>$c</td><td>$q</td></tr>\n";}echo "</table>\n\n";fullTables($companies,$table_size);}function fullTables($companies,$table_size){$straglers=array();$extras=0;echo "<table>\n";echo "<tr><th>Company</th><th>FullTables</th><th>Extras</th></tr>\n";foreach($companies as $name=>$qty){echo "<tr><td>$name</td>";$tables=$qty/$table_size;if(!strpos($tables,'.'))$tables=number_format($tables,1);$totals=explode('.',$tables);$extras=$qty;if($qty>1)$extras=(intval($totals[1])/100)*$table_size;if($extras>$table_size&&$qty>=$table_size)$extras=$extras/10;if($extras<1&&$extras!=0)$extras=$extras*10;if($qty<=$table_size)$extras=$qty/1;echo "<td>$totals[0]</td><td>{$extras}</td>";$straglers[$name]=$extras;echo "</tr>\n";}echo "</table>\n\n";mixRemaining($companies,$straglers,$table_size);}function mixRemaining($companies,$straglers,$table_size){$assoc=array();$numeric=array();foreach($straglers as $c=>$q){array_push($assoc,$c);array_push($numeric,$q);}$i=0;$l=count($straglers);$jokers=0;$individuals=0;echo "<table>\n";echo "<tr><th>Companies</th><th>Grouped</th><th>Supply</th></tr>\n";while($i<$l){if($i!=$l-1&&$numeric[$i]>0){$members=$numeric[$i]+$numeric[$i+1];if($members>$table_size){$jokers=$members-$table_size;$remainder=$numeric[$i+1]-$jokers;$members=$numeric[$i]+$remainder;}else{$spaces_left=$table_size-$members;$jokers=0;}$mingled="$assoc[$i] and {$assoc[$i+1]}";echo "<tr><td>$mingled</td>";echo "<td>($numeric[$i]+{$numeric[$i+1]})$members</td>";if($jokers){echo "<td class=\"open\">$jokers extra {$assoc[$i+1]} members</td>";}else echo "<td class=\"over\">$spaces_left  spaces left</td>";if($jokers&&$i===($l-1))echo "<td>[+$jokersextra{$assoc[$i+1]}member(s)inlasttable.]</td>";$i++;echo "</tr>\n";}else{($jokers>0)?$final="$jokers extra people.":$final='all tables full!';break;}}echo "</table>\n\n";summary($companies,$straglers,$table_size,$final);}function summary($companies,$straglers,$table_size,$final){$total_companies=count($companies);$total_people=array_sum($companies);$total_tables=$total_people/$table_size;echo "<h4 id=\"summary\">$total_companies companies with $total_people people using $total_tables tables leaving $final</h4>\n";} ?>

通过completeList($companies,8);调用,其中8是最大表容量:

<div id="table-table">
  <h4>Assuming you have a maxium capacity of 8 per table:</h4>
    <?php completeList($companies,8); ?>
</div>

我为时尚投入了一些风格。您可以看到输出here的示例。

我唯一无法弄清楚的是那个饼干在哪里?

祝你好运!它实际上是一个相当复杂的脚本,但它似乎完美地工作:)