PHP - Разбить массив на РАЗНЫЕ части

Допустим есть массив из 10 элементов. Нужно разбить его на 3 части, но чтобы в одном из полученных массивов элементов было меньше чем в 1 и 2. Т.е. например в первом 4, во втором 2, в третьем 4. Как это можно реализовать? Все что выдает гугл - это array_chunk


Ответы (2 шт):

Автор решения: MBo

Для того, чтобы N элементов разбить на три части, одна из которых меньше двух других, в качестве длины короткой части нужно взять любое число, не большее (N-2)/3

Short = любое из диапазона 1..(N-2)/3;
Middle = любое из диапазона Short+1..(N-Short)/2;
Large = N-Short-Middle  (может быть равно Middle); 

А потом переставляете длины частей, как угодно

Если вторая и третья часть тоже должны различаться - нетрудно чуть доработать

Пример генерации всех возможных разбиений ненулевой длины на Python

1 2 7
1 3 6
1 4 5
2 3 5
2 4 4
→ Ссылка
Автор решения: phpBear

Реализация на PHP по алгоритму предложенному @MBo (если что плюсик за верный ответ ставьте ему :) )

<?php
$array_length = 10;
$p1 = rand(1, intval(($array_length-2)/3));
$p2 = rand($p1 + 1, intval(($array_length-$p1)/2));
$p3 = $array_length - $p1 - $p2;

$p = [$p1, $p2, $p3];
shuffle($p);

$p1 = $p[0];
$p2 = $p[1];
$p3 = $p[2];

echo $p1." ".$p2." ".$p3."\n";

→ Ссылка