Мне нужно разбить массив на несколько фрагментов, каждый из которых имеет одинаковое количество элементов (даже повторяющихся в разных фрагментах), сбалансированных по выходным данным.
Итак, например, начиная с такого массива:
$input = array(1,2,3,4,5,6,7,8,9,10,11);
Я пытаюсь разработать функцию, которая принимает входной массив и количество элементов, ожидаемых для каждого фрагмента. Так, например, [ balanced_chunk($input, 3) ]
должен получить меня
0 => array(1,2,3)
1 => array(4,5,6)
2 => array(6,7,8) #-- Value 6 is repeated
3 => array(9,10,11)
пока [ balanced_chunk($input, 5) ]
должен получить меня
0 => array(1,2,3,4,5)
1 => array(4,5,6,7,8) #-- Value 4,5 are repeated
2 => array(7,8,9,10,11) #-- Value 7,8 are repeated
и так далее
Для начала я разработал такую функцию
function balanced_chunk($input, $size) {
$step = ceil(count($input) / $size);
$chunks = range(0, count($input), count($input) / $step);
reset($chunks);
while (list(,$start) = each($chunks)) {
$start = (fmod($start, 1) <= 0.5 ? floor($start) : ceil($start));
$clist[] = array_slice($input, $start, $size, true);
}
return($clist);
}
но по той причине, что в данный момент я пропускаю, у меня получается такой вывод:
[0] => Array (1,2,3,4,5)
[1] => Array (5,6,7,8,9) #-- this element should instead start from 4...
[2] => Array (8,9,10,11) #-- last element contains only 4 value
Просто чтобы сделать лучший пример, рассмотрим входной массив [ a,b,c,d,e,f,g,h,i,l,m,n,o,p ]
сбалансированный кусок с 5 элементами каждый должен быть
[ a,b,c,d,e ]
[ f,g,h,i,l ]
[ l,m,n,o,p ] #-- letter 'l' is repeated twice on 3rd result
или (как допустимая альтернатива)
[ a,b,c,d,e ]
[ e,f,g,h,i ] #-- letter 'e' is repeated twice on 2nd result
[ l,m,n,o,p ]
сбалансированный кусок с 8 элементами каждый должен быть
[ a,b,c,d,e,f,g,h ]
[ g,h,i,l,m,n,o,p ] #-- letter 'g','h' are repeated twice
Я застрял! После нескольких попыток самостоятельно я не могу найти, как решить эту проблему.
6,7,8,9,10
также действительным, если 8,9 и 10 повторяются? Как насчет5,6,7,8,9
, где 5, 8 и 9 повторяются в другом месте (5 в первом массиве и 8 и 9 во втором)? - person madebydavid   schedule 17.04.2014[1,2,3,4,5][6,7,8,9,10][7,8,9,10,11]
, что означает, что 0 значений 1-го результата являются общими со 2-м, а 4 результата 2-го результата являются общими с последним. В то время как сбалансированное распределение должно производить[1,2,3,4,5][4,5,6,7,8][7,8,9,10,11]
, где 2 значения 1-го результата совпадают со 2-м, а 2 результата 2-го - общими с 3-м. - person Stefano Radaelli   schedule 18.04.2014