Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Разделить массив на N не равных частей
balambasik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 39255
На форуме: 2 года, 8 месяцев, 11 дней
Карма: 1




Всем привет.

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

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

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




PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
forza  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 396
Пользователь №: 23841
На форуме: 6 лет, 3 месяца, 2 дня
Карма: 22






--------------------
Заработок для веб-разработчиков: CodeCanyon
Мое Портфолио
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14978
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 3 дня
Карма: 444




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


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5497
Пользователь №: 35718
На форуме: 4 года, 20 дней
Карма: 167




Цитата (sergeiss @ 4.12.2015 - 16:26)
чтобы сумма была равна 3000

накуя?


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5497
Пользователь №: 35718
На форуме: 4 года, 20 дней
Карма: 167




Цитата (balambasik @ 4.12.2015 - 13:40)
Столкнулся с такой незаурядной задачей.

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

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


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14978
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 3 дня
Карма: 444




Цитата (Valick @ 4.12.2015 - 17:50)
накуя?

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


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
balambasik  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 39255
На форуме: 2 года, 8 месяцев, 11 дней
Карма: 1




Цитата (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]);

}
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса