$a = array(8, 16, 16, 32, 8, 8, 4, 4);
使用像上面那样的数组有一种方法,所以我可以根据总和达到设定值的值来划分/拆分数组。例如,如果我希望它们等于32.我的最终数组将有多达100个值,全部为32,16,8或4,我只需要对项目进行分组,使得值始终等于设定量,因此在此示例中为32。
从上面的数组我希望得到:
$a[0][1] = 16
$a[0][2] = 16
$a[1][3] = 32
$a[2][0] = 8
$a[2][4] = 8
$a[2][5] = 8
$a[2][6] = 4
$a[2][7] = 4
因为$ a [0]总计达到32,所以$ a [1]和$ a [2]也是如此。
答案 0 :(得分:4)
$a = array(8, 16, 16, 32, 8, 8, 4, 4);
$limit = 32;
rsort($a);
$b = array(array());
$index = 0;
foreach($a as $i){
if($i+array_sum($b[$index]) > $limit){
$b[++$index] = array();
}
$b[$index][] = $i;
}
$a = $b;
print_r($a);
它会起作用,但只是因为在你的情况下你有4 | 8 | 16 | 32,并且仅当所需的总和是最大数字的倍数(32)时。
测试:http://codepad.org/5j5nl3dT
注意:|
表示divides
。
答案 1 :(得分:0)
function split_into_thirtytwos($input_array) {
$output_array=array();
$work_array=array();
$sum=0;
sort($input_array,SORT_NUMERIC);
while(count($input_array)>0) {
$sum=array_sum($work_array)+$input_array[count($input_array)-1];
if($sum<=32) {
$work_array[]=array_pop($input_array);
} else {
$output_array[]=$work_array;
$work_array=array();
}
}
if(count($work_array)>0) {$output_array[]=$work_array;}
return $output_array;
}
使用您的输入进行测试:
Array
(
[0] => Array
(
[0] => 32
)
[1] => Array
(
[0] => 16
[1] => 16
)
[2] => Array
(
[0] => 8
[1] => 8
[2] => 8
[3] => 4
[4] => 4
)
)
答案 2 :(得分:0)
$a = array(8, 16, 16, 32, 8, 8, 4, 4);
$group_limit = 32;
$current_group = $result = array();
$cycles_since_successful_operation = 0;
while ($a && $cycles_since_successful_operation < count($a))
{
array_push($current_group,array_shift($a));
if (array_sum($current_group) > $group_limit)
array_push($a,array_pop($current_group));
elseif (array_sum($current_group) < $group_limit)
$cycles_since_successful_operation = 0;
elseif (array_sum($current_group) == $group_limit)
{
$result []= $current_group;
$current_group = array();
$cycles_since_successful_operation = 0;
}
}
if ($a)
$result []= $a; // Remaining elements form the last group