我希望尽可能均匀地将一个数组拆分为多行,并遵守每行最小计数约束,以便行计数尽可能接近最小值,并且不同行计数之间的差值永远不超过1。
换句话说,每行中的元素数不能低于$min或高于(2 * $min - 1)。
例如,我有一个65个元素的数组,最小行大小约束为9。
$x = range(1, 65);
$min = 9;
我想将数组拆分为多行,其中较长的行出现在较短的行之前。
[
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
[21, 22, 23, 24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35, 36, 37, 38],
[39, 40, 41, 42, 43, 44, 45, 46, 47],
[48, 49, 50, 51, 52, 53, 54, 55, 56],
[57, 58, 59, 60, 61, 62, 63, 64, 65],
]
2条答案
按热度按时间oyt4ldly1#
经过几个小时的实验,我找到了答案:D
kognpnkq2#
通过执行以下计算,使用
array_splice()
和array_chunk()
的方法可以代替迭代过程。$count
)$maxRows
)$maxRows
,被除数向上舍入($maxColumns
)$maxRows
后的余数代码:(Demo)
两次分块尝试(都可能产生空数组)通过在数组中使用spread运算符(
...
)解包它们的行合并在一起。如果愿意,可以调用array_merge()
,而不是解包到数组中。