У меня возникли проблемы с написанием точного и эффективного кода в PHP для этой проблемы ниже.PHP Вложенный массив «Mesh Like» Группировка
У меня есть список пользователей, и у каждого пользователя есть список друзей. Я хочу сгруппировать всех друзей в группы, где каждый человек имеет по крайней мере одного друга с другим пользователем.
Ниже приведен упрощенный массив с удаленными ключами из массива и идентификаторы пользователя заменены именами.
Array
[Ted] => Array
[friends] => Array
[0] => Sarah
[John] => Array
[friends] => Array
[0] => Peter
[1] => Sam
[Peter] => Array
[friends] => Array
[0] => John
[1] => Sam
[Frank] => Array
[friends] => Array
[0] => Bob
[1] => Sarah
[Kevin] => Array
[friends] => Array
[0] => Sally
[Sam] => Array
[friends] => Array
[0] => John
[1] => Peter
[Bob] => Array
[friends] => Array
[0] => Frank
[1] => Sarah
[Sarah] => Array
[friends] => Array
[0] => Frank
[1] => Bob
[2] => Ted
[3] => Jane
[Sally] => Array
[friends] => Array
[0] => Kevin
[Jane] => Array
[friends] => Array
Выход из этого должно быть следующим:
Группа 1: Сара, Фрэнк, Боб, Джейн, Тед
Группа 2: Джон, Питер, Сэм
Группа 3: Салли, Кевин
Как примечание, для Джейн нет данных, но Сара дружит с ней, поэтому такая группировка может случиться. Также будут пользователи без друзей, они должны быть размещены в собственной группе.
Я попытался написать код для этого, но он очень неэффективен и содержит три вложенных петли foreach. Я очень стыдно :(
$friendGroups = [];
foreach($userdata as $key => $user)
{
$friends = $user["friends"];
// Loop the current groups
foreach($friendGroups as $friendkey => $friendValue)
{
// Does the group contain any of the friends?
foreach($friends as $friendID)
{
if (array_key_exists($friendID, $friendValue))
{
// add the friends to this group
foreach($friends as $friendIDx)
{
$friendGroups[$friendkey][$friendIDx] = $userdata[$friendIDx];
}
continue 3;
}
}
}
$groupID = count($friendGroups);
// Create a new group
foreach($friends as $friendID)
{
$friendGroups[$groupID][$friendID] = $userdata[$friendID];
}
}
выглядит намного более простым, точным и более эффективным, что мое решение! Спасибо, что уделили им время, чтобы помочь, я дам ему повод :) – mt025
Большое спасибо! Работа безупречно. – mt025
Удивительный, рад, что я мог бы помочь. :) – Ruben