PHP根据总值将行数据分为两组

PHP根据总值将行数据分为两组,php,Php,下面是我的数据集 ID | Dept | Value 1 | 0 | 50.58 2 | 0 | 75.64 3 | 0 | 32.57 4 | 0 | 187.57 5 | 0 | 354.54 我将如何将其分为两组,分别为部门1和部门2,在这两组中,细分将基于价值。i、 e.价值接近总价值的一半 在上面的示例中,ID 1-4在第1组中的总数为346.36,ID 5在第2组中的总数为354.54。这是一个非常困难的问题。有很多算法可以实现这种

下面是我的数据集

ID | Dept | Value

1  | 0    | 50.58

2  | 0    | 75.64

3  | 0    | 32.57

4  | 0    | 187.57

5  | 0    | 354.54
我将如何将其分为两组,分别为部门1和部门2,在这两组中,细分将基于价值。i、 e.价值接近总价值的一半


在上面的示例中,ID 1-4在第1组中的总数为346.36,ID 5在第2组中的总数为354.54。

这是一个非常困难的问题。有很多算法可以实现这种“装箱”解决方案(即尝试在不同的容器中平均分割不同的大小)。这基本上是一样的。请查看以获取更多信息


简而言之,这并不容易,而且最多只能得到最佳解决方案的近似值。

这段代码应该做您希望它做的事情

<?php 
// Your records stored as arrays
$records = array(
        array(1, 0, 50.58),
        array(2, 0, 75.64),
        array(3, 0, 32.57),
        array(4, 0, 187.57),        
        array(5, 0, 354.54)
);

// Blank value for total value
$total_value = 0;

// Calculate half way of total
foreach ($records AS $record)
{
    $total_value += $record[2];
}

// Get the half way point
$half_way = $total_value / 2;

// Create array for each department
$dept_1 = array();
$dept_2 = array();

// Split the records in to department
foreach ($records AS $record)
{
    if ($record[2] >= $half_way)
    {
        // Put in to department 1
        array_push($dept_2, $record);
    }
    else
    {
        // Put in to department 2
        array_push($dept_1, $record);
    }
}

// Show each departments contents
var_dump($dept_1);
var_dump($dept_2);
?>

呵呵?总价值的一半是350.45。因此,您需要
dept1
中的值小于此值的任何内容,以及
dept2
中的任何其他内容?这并不是问题所要求的。他希望分配给每个部门的项目总数约为总数的一半。您的解决方案在这种情况下有效(因为一个部门只有一个,其他部门只有一个),但是如果您要添加另一个大项目,它将不起作用。您能给出任何获得近似值的代码示例吗,我没想到每次都能得到准确的答案,因为数据集可能会定期变化。我相信我为另一个问题提供的链接有一些例子。再看看。基本上,最简单的解决方案是按值的降序对项目进行排序,并将它们分配给第一个有剩余空间的部门。然而,在您的情况下,您不介意稍微溢出,因此您必须想出此想法的一些变体。
array(4) {
  [0]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(0)
    [2]=>
    float(50.58)
  }
  [1]=>
  array(3) {
    [0]=>
    int(2)
    [1]=>
    int(0)
    [2]=>
    float(75.64)
  }
  [2]=>
  array(3) {
    [0]=>
    int(3)
    [1]=>
    int(0)
    [2]=>
    float(32.57)
  }
  [3]=>
  array(3) {
    [0]=>
    int(4)
    [1]=>
    int(0)
    [2]=>
    float(187.57)
  }
}

array(1) {
  [0]=>
  array(3) {
    [0]=>
    int(5)
    [1]=>
    int(0)
    [2]=>
    float(354.54)
  }
}