разделить массив на отрезки, где в одном отрезке рандом значений

Klaus

SEO Cthulhu
разделить массив на отрезки, где в одном отрезке рандом значений

Делю массив на отрезки так:
PHP:
while($array){
   $rand = mt_rand(10,15);
   $piece[] = array_splice($array, 0, $rand);
}
можно конечно array_chunk, но тогда получу отрезки с одинаковым кол-вом значений(кроме последнего отрезка), а задача стоит поделить массив на отрезки с заданным рандомным кол-вом значений.
Все работает, но задача состоит еще в том, чтобы в последнем отрезке было не менее 5 значений.
Подскажите плз, как это реализовать. Что-то никак не сообразить.

P.S. Кол-во элементов в исходном массиве $array всегда разное.
 

Фанат

oncle terrible
Команда форума
для тебя принципиально, чтобы именно в последнем отрезке было 5 значений? ;-)
 

Varg

Guest
Ранд от 5 до числа элементов вырезаеш с конца, а дальше как у тебя
 

Varg

Guest
Учитывая, что элементов стало на $rnd меньше
 

Klaus

SEO Cthulhu
to Varg
дык там рандомом каждый цикл, соответственно сколько не вырезай с конца, а остается вероятность, что последний в цикле может быть менее 5
 

Varg

Guest
Нет. Сначала вырезаешь рандом последние, а затем циклом остатки делишь, ясно?
 

Varg

Guest
А если не секрет, где может понадобиться данная задача? :)
 

Varg

Guest
Только если важно положение в массиве piece[] то тогда _добавляешь_ после цикла последние >=5 из некоего темпового массива.

1. $end = array_slice($array,-1 * mt_rand(5,sizeof($array)));
2. while(....) {...}
3. $pieces[] = $end;

edit: строка 1 исправлена :)
 

Klaus

SEO Cthulhu
to Varg
или моя твоя не понимай :) или я тупой как дерево :))
мне нужно рандомное кол-во значений в каждом отрезке. поэтому я никак не могу понять, что может решить предварительная вырезка последнего отрезка.
 

Varg

Guest
Так. Приехали.
Тебе нужно чтобы последний из $pieces был >5 или чтобы последние >5 элементов из $array были в последнем элементе $pieces?

Что то ты меня запутал.
Объясни ка подоходчивее. По русски :)
 

Фанат

oncle terrible
Команда форума
классика.
как всегда - как партизан молчит, зачем ему это надо.
Ну как же - он умнее всех :)
 

Klaus

SEO Cthulhu
изначально задача стоит в том, чтобы поделить массив на отрезки в каждом из которых по 10-15 элементов..
но так как я ничего лучше пока не придумал, чем тот код который в самом начале треда, то у меня получается, что в поледнем отрезке элементов меньше чем нужно.
вот как мне сделать, что бы в каждом отрезке массива, было не менее 10-15 элементов или хотябы в одном! отрезке не менее пяти элементов.
 

Klaus

SEO Cthulhu
поправка, не менее 10 но не более 15 во всех отрезках
или только в одном(!) отрезке не менее 5 но не более 15

to Фанат
да не то чтобы скрываю, просто стыдно. :)
мои проекты так мизерны и ничтожны, что говорить о них, только надсмехаться
 

Varg

Guest
2Klaus, тогда мой метод не подойдёт, раз условия столь жёстки :)

А если так:
PHP:
while(TRUE) {
if (sizeof($array) > 20) {
$pieces[] = array_slice(10-15...);
} else {
if (sizeof($array) < 15) {
$pieces[] = $array;
break;
} else {
$pieces[] = array_slice(10-15...);
$pieces[] = $array;
break;
}
}
}
Вроде так.
2Фанат :)
 

Varg

Guest
Спешу тебя обрадовать :) не пашет.
Надо впредь проверять, что пишу :)
Сейчас подумаем.

Если в последнем шаге выпадет остаток первичного массива в 16-19 элементов, то логично будет n-5 отправить в pieces, а остаток 5 тоже туда же собственно :)
 

Varg

Guest
Вот. Решение :)
PHP:
$array = array();
$pieces = array();
for ($i = 0 ; $i < 60 ; $i++)
	$array[] = $i;
function make_seed() {
   list($usec, $sec) = explode(' ', microtime());
   return (float) $sec + ((float) $usec * 100000);
}
while(TRUE) {
	mt_srand(make_seed());
	$Int = mt_rand(10,15);
	if (sizeof($array) > 20) {
		// > 20
		$pieces[] = array_slice($array,0,$Int);
		$array = array_slice($array,$Int);
	} elseif(sizeof($array) <= 15) {
		// <= 15
		$pieces[] = $array;
		break;
	} else {
		// 16 - 20
		$pieces[] = array_slice($array,0,sizeof($array) - 5);
		$array = array_slice($array,sizeof($array) - 5);
		$pieces[] = $array;
		break;
	}
}
echo "<pre>"; print_r($pieces);
Надеюсь правила форума не нарушены :)

edit: забыл про <=
 
Сверху