Mit forslag:
<?php
function loadraw() {
$con = new mysqli('localhost', 'root', '', 'Test');
$stmt = $con->prepare('SELECT id,person_id FROM grp ORDER BY RAND()');
$stmt->execute();
$res = $stmt->get_result();
$raw = $res->fetch_all(MYSQLI_ASSOC);
$res->free();
$stmt->close();
$con->close();
return $raw;
}
function init(&$onegroup, &$ingroup, &$dupl) {
$onegroup = array();
$ingroup = array();
$dupl = array();
}
function process_row($row, &$ingroup, &$onegroup, &$dupl, &$groups, $max) {
if(array_key_exists($row['person_id'], $ingroup)) {
$dupl[] = $row;
} else {
$onegroup[] = $row;
$ingroup[$row['person_id']] = true;
}
if(count($onegroup) == $max) {
$groups[] = $onegroup;
$olddupl = $dupl;
init($onegroup, $ingroup, $dupl);
foreach($olddupl as $row) {
process_row($row, $ingroup, $onegroup, $dupl, $groups, $max);
}
if(count($dupl) > 0) throw new Exception("Could not complete grouping");
}
}
function dogrouping($raw, $max)
{
$groups = array();
init($onegroup, $ingroup, $dupl);
foreach($raw as $row) {
process_row($row, $ingroup, $onegroup, $dupl, $groups, $max);
}
$olddupl = $dupl;
$dupl = array();
foreach($olddupl as $row) {
process_row($row, $ingroup, $onegroup, $dupl, $groups, $max);
}
if(count($dupl) > 0) throw new Exception("Could not complete grouping");
if(count($onegroup) > 0) {
$groups[] = $onegroup;
}
return $groups;
}
$raw = loadraw();
echo "Raw:\r\n";
foreach($raw as $row) {
echo $row['id'] . ' ' . $row['person_id'] . "\r\n";
}
echo "\r\n";
$grouped = dogrouping($raw, 10);
$gn = 1;
foreach($grouped as $group) {
echo "Group $gn:\r\n";
foreach($group as $row) {
echo ' ' . $row['id'] . ' ' . $row['person_id'] . "\r\n";
}
$gn++;
}
?>
CREATE TABLE grp (id INTEGER NOT NULL, person_id INTEGER NOT NULL, PRIMARY KEY(id));
INSERT INTO grp VALUES(1, 1005);
INSERT INTO grp VALUES(2, 1021);
INSERT INTO grp VALUES(3, 1002);
INSERT INTO grp VALUES(4, 1018);
INSERT INTO grp VALUES(5, 1015);
INSERT INTO grp VALUES(6, 1001);
INSERT INTO grp VALUES(7, 1022);
INSERT INTO grp VALUES(8, 1019);
INSERT INTO grp VALUES(9, 1006);
INSERT INTO grp VALUES(10, 1026);
INSERT INTO grp VALUES(11, 1014);
INSERT INTO grp VALUES(12, 1029);
INSERT INTO grp VALUES(13, 1003);
INSERT INTO grp VALUES(14, 1025);
INSERT INTO grp VALUES(15, 1017);
INSERT INTO grp VALUES(16, 1007);
INSERT INTO grp VALUES(17, 1028);
INSERT INTO grp VALUES(18, 1011);
INSERT INTO grp VALUES(19, 1027);
INSERT INTO grp VALUES(20, 1002);
INSERT INTO grp VALUES(21, 1012);
INSERT INTO grp VALUES(22, 1012);
INSERT INTO grp VALUES(23, 1027);
INSERT INTO grp VALUES(24, 1005);
INSERT INTO grp VALUES(25, 1016);
INSERT INTO grp VALUES(26, 1010);
INSERT INTO grp VALUES(27, 1024);
INSERT INTO grp VALUES(28, 1004);
INSERT INTO grp VALUES(29, 1016);
INSERT INTO grp VALUES(30, 1013);
INSERT INTO grp VALUES(31, 1009);
INSERT INTO grp VALUES(32, 1008);
INSERT INTO grp VALUES(33, 1023);
INSERT INTO grp VALUES(34, 1020);