[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разделить массив на N не равных частей
balambasik
Всем привет.

Столкнулся с такой незаурядной задачей.
Есть одномерный массив на 3000 элементов. Нужно разделить его на 20 частей. И что важно, разных по количеству элементов. В каждом куске массива должно получится от 100 до 200 элементов.

array_chunk() здесь не поможет, он делит массив на равные части.

Вобщем не могу даже придумать алгоритм действий. Надеюсь на советы форумчан.




forza
Как насчет array_slice? http://us3.php.net/manual/en/function.array-slice.php

_____________
Заработок для веб-разработчиков: CodeCanyon
Мое Портфолио
sergeiss
balambasik, можно так подойти.
Создаешь вспомогательный массив из 20 элементов. С помощью генератора случайных чисел заполняешь его так, чтобы сумма была равна 3000 и чтобы не было одинаковых элементов. Как это сделать - это уже отдельный разговор smile.gif Можно не генератором случайных чисел заполнять, а как-нибудь по-другому. Как именно, тут вариантов много можно придумать.
Сортируешь массив в порядке возрастания/убывания, если требуется.
Затем берешь и отрезаешь от основного массива по сколько элементов, сколько чисел у тебя во вспомогательном массиве.
Ну, то есть, получил числа [ 120, 126, 145, ....] и отрезаешь от основного массива части по 120 элементов (первая часть), 126 элементов, 145 элементов...

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Valick
Цитата (sergeiss @ 4.12.2015 - 16:26)
чтобы сумма была равна 3000
Valick
Цитата (balambasik @ 4.12.2015 - 13:40)
Столкнулся с такой незаурядной задачей.

как случилась такая задача? откуда получен массив? что планируете делать с этими разбитыми массивами дальше?
Цитата (balambasik @ 4.12.2015 - 13:40)
И что важно, разных по количеству элементов.

разных от балды? или всё-таки существует какое-то условие по которому должен родиться массив?

_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (Valick @ 4.12.2015 - 17:50)
накуя?

Потому что "есть одномерный массив на 3000 элементов" smile.gif И я предлагаю сначала определить, на сколько частей и по сколько в каждой делить. Сумма, по-любому, должна быть равна количеству элементов.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
balambasik
Цитата (sergeiss @ 4.12.2015 - 17:26)
balambasik,  С помощью генератора случайных чисел заполняешь его так, чтобы сумма была равна 3000 и чтобы не было одинаковых элементов. Как это сделать - это уже отдельный разговор :)

Это оказалось самым сложным.


$count_arr = 3000; // количество элементов в массиве
$count_chunk = 20; // на сколько частей нужно разделить массив
$int_min = 100; // мин. число
$int_max = 200; // макс.число


// сначала нужно разделить наш массив на 20 равных частей ( 3000 / 20 = 150 )
// заполним массив. 20 элементов - каждый элемент равен 150

$array = array_fill(0, $count_chunk, floor($count_arr / $count_chunk) );


// генерируем массив, 1000 от балды, чтобы лучше перемешалось
for($i=0;$i<1000;$i++)
{
// получаем рандомное число N
$rand = rand(1, 10);

// здесь проверка что бы каждый элемент массива был > 100 и < 200
if($array[0] > ($rand + $int_min) and $array[1] < ($int_max - $rand))
{
// отнимем у первого элемента массива рандомное число N
$array[0] = $array[0] - $rand;

// прибавим второму элементу массива рандомное число N
$array[1] = $array[1] + $rand;

// перемешиваем массив (при этом сумма всех элементов масиива НЕ поменялась)
shuffle($array);
}
}




Это вернет нам такой вспомогательный массив

Array
(
[0] => 146
[1] => 199
[2] => 186
[3] => 145
[4] => 158
[5] => 153
[6] => 174
[7] => 149
[8] => 107
[9] => 164
[10] => 159
[11] => 123
[12] => 124
[13] => 125
[14] => 134
[15] => 127
[16] => 148
[17] => 126
[18] => 197
[19] => 156
)

array_sum($array); // 3000




А дальше просто режем массив

// Наш массив яблок который нужно разделить	на 20 кучек,
// И в каждой кучке должно быть от 100 до 200 яблок.
// И сумма всех яблок должна быть 3000

$apple_array = range(0,3000);



// режем массив
for($i=0;$i<20;$i++)
{
// отрезаем кусок от начала массива до N
$out[] = array_slice($apple_array, 0, $array[$i]);

// удаляем кусок от начала массива до N
array_splice($apple_array, 0, $array[$i]);

}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.