为了账号安全,请及时绑定邮箱和手机立即绑定

将数组拆分为相等的部分,每个数组最多 6 个项目

将数组拆分为相等的部分,每个数组最多 6 个项目

PHP
白衣染霜花 2021-12-03 15:02:50
我试图将一组项目拆分为多个相等的部分,每个数组最多 6 个项目例如:5 items in original array --> result: 1 array with 5 items12 items in original array --> result: 2 arrays with 6 items7 items in original array --> result: 2 arrays with 3 and 4 items13 items in original array --> result: 3 arrays with 5,4,4 items我完全不知道如何开始

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

我想这就是你要找的。不完全漂亮,但工作:


<?php

$size = 13;

$step = 6;


$input = array_keys(array_fill(0, $size, null));

$count = ceil($size / $step);

$chunk = floor($size / $count);

$bonus = $size % $count;


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

    $output[] = 

        $i == 0 ? 

        array_slice($input, $i * $chunk, $chunk + $bonus) : 

        array_slice($input, $i * $chunk + $bonus, $chunk);

}


print_r($output);

这$size是数组$step的大小,是从该数组中切割的块的大小。您可以使用这些值。


具有上述设置的示例输出将是:


Array

(

    [0] => Array

        (

            [0] => 0

            [1] => 1

            [2] => 2

            [3] => 3

            [4] => 4

        )


    [1] => Array

        (

            [0] => 5

            [1] => 6

            [2] => 7

            [3] => 8

        )


    [2] => Array

        (

            [0] => 9

            [1] => 10

            [2] => 11

            [3] => 12

        )

)


查看完整回答
反对 回复 2021-12-03
?
慕容708150

TA贡献1831条经验 获得超4个赞

好的,我用更动态的编程方式做到了这一点,其中我们计算较小子问题的分布,然后从6到1,查看$j代码中的当前分布是否适合之前的任何分布。


<?php


$arr = [];


$size = rand(1,150);

$range = range(1,$size);

$dist = [];

$dist[] = [];


for($i=1;$i<=$size;++$i){

    if($i <= 6) $dist[] = [$i];

    else{

        for($j=6;$j>=1;--$j){

            if(abs($j - $dist[$i-$j][0]) <= 1){

                $dist[] = array_merge($dist[$i-$j],[$j]);

                break;

            }

        }

    }

}


// echo $size,PHP_EOL;

// print_r($dist[$size]); print the distribution if you want.


$result = [];


$curr_index = 0;

foreach($dist[$size] as $chunk_size){

    $result[] = array_slice($range,$curr_index,$chunk_size);

    $curr_index += $chunk_size;

}



echo $size,PHP_EOL;

print_r($result);

演示: https : //3v4l.org/gCWB2(请注意,每个版本的 PHP 输出不同,因为每次生成的数组大小随机数不同)。


更新:您可以针对这条粗线进一步优化上面的代码$dist[] = array_merge($dist[$i-$j],[$j]); ,但这是我留给你的练习(提示:只存储最小的开始计数)。


查看完整回答
反对 回复 2021-12-03

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号