Мы можем прочитать , чтобы найти как можно меньшего числа групп - комбинаторная NP-сложная задача , но с алгоритмом, таким как Сначала Fit При уменьшении мы получаем результаты, которые должны быть достаточно хорошими. Вот пример реализации:
$files = array('1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg', '9.jpg', '10.jpg');
$sizes = array(3.2, 2.8, 3.5, 2.1, 0.9, 2.9, 2.4, 2.1, 1.1, 1.9);
$limit = 10;
$files = array_combine($files, $sizes);
# algorithm "First Fit Decreasing"
arsort($files); # sort the files by descending size
$groups = array();
foreach ($files as $file => $size)
{ # insert the files one by one
# so that each is placed in the first group that still has enough space
foreach ($groups as &$group)
if (array_sum($group)+$size <= $limit)
{ $group[$file] = $size; continue 2; }
# if there is not enough space in any of the groups that are already open,
# open a new one
$groups[][$file] = $size;
}
unset($group);
# the filenames are the keys within each group
foreach ($groups as $group) print_r(array_keys($group));