PHP嵌套数组';网状';分组
对于下面这个问题,我在用PHP编写准确高效的代码时遇到了一些问题 我有一个用户列表,每个用户都有一个朋友列表。我想把所有的朋友分组,每个人至少有一个朋友和另一个用户在一起 下面是一个简化的数组,删除了不需要的数组键,并用名称替换了用户idPHP嵌套数组';网状';分组,php,arrays,grouping,Php,Arrays,Grouping,对于下面这个问题,我在用PHP编写准确高效的代码时遇到了一些问题 我有一个用户列表,每个用户都有一个朋友列表。我想把所有的朋友分组,每个人至少有一个朋友和另一个用户在一起 下面是一个简化的数组,删除了不需要的数组键,并用名称替换了用户id Array [Ted] => Array [friends] => Array [0] => Sarah [John] => Array
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
其输出应如下所示:
第一组:莎拉、弗兰克、鲍勃、简、特德
第二组:约翰、彼得、萨姆
第三组:莎莉,凯文
值得注意的是,没有Jane的数据,但Sarah是她的朋友,因此可以进行分组。也会有没有朋友的用户,他们应该被放置在自己的组中
我曾尝试为此编写代码,但效率非常低,并且包含三个嵌套的foreach循环我很惭愧:(
一个非常简单但可能不是最优的解决方案是首先将输入数组展平为一维数组。您只需要知道哪些初始组有匹配的朋友,就可以知道哪些组要彼此合并 展平示例输入数组将导致:
Array
(
[0] => Array
(
[0] => Ted
[1] => Sarah
)
[1] => Array
(
[0] => John
[1] => Peter
[2] => Sam
)
[2] => Array
(
[0] => Peter
[1] => John
[2] => Sam
)
[3] => Array
(
[0] => Frank
[1] => Bob
[2] => Sarah
)
[4] => Array
(
[0] => Kevin
[1] => Sally
)
[5] => Array
(
[0] => Sam
[1] => John
[2] => Peter
)
[6] => Array
(
[0] => Bob
[1] => Frank
[2] => Sarah
)
[7] => Array
(
[0] => Sarah
[1] => Frank
[2] => Bob
[3] => Ted
[4] => Jane
)
[8] => Array
(
[0] => Sally
[1] => Kevin
)
[9] => Array
(
[0] => Jane
)
)
您可以使用array_intersect检查每个组的匹配朋友,并使用array_unique和array_merge组合来合并两个组
以下是这种方法的一个示例:
function flatten($input) {
$output = [];
$i = 0;
foreach ($input as $name => $data) {
$output[$i] = [$name];
foreach ($data['friends'] as $friend) {
$output[$i][] = $friend;
}
$i++;
}
return $output;
}
$input = [
'Ted' => [
'friends' => [
'Sarah'
]
],
'John' => [
'friends' => [
'Peter',
'Sam'
]
],
'Peter' => [
'friends' => [
'John',
'Sam'
]
],
'Frank' => [
'friends' => [
'Bob',
'Sarah'
]
],
'Kevin' => [
'friends' => [
'Sally'
]
],
'Sam' => [
'friends' => [
'John',
'Peter'
]
],
'Bob' => [
'friends' => [
'Frank',
'Sarah'
]
],
'Sarah' => [
'friends' => [
'Frank',
'Bob',
'Ted',
'Jane'
]
],
'Sally' => [
'friends' => [
'Kevin'
]
],
'Jane' => [
'friends' => []
]
];
$flattened = flatten($input);
for ($i = 0; $i < count($flattened); $i++) {
$mergedIndices = [];
// Check for same friends among other groups than current one
for ($j = 0; $j < count($flattened); $j++) {
if ($i !== $j && count(array_intersect($flattened[$i], $flattened[$j])) > 0) {
// Found match between two groups, so merge them
$flattened[$i] = array_unique(array_merge($flattened[$i], $flattened[$j]));
$mergedIndices[] = $j;
}
}
// Purge merged items
foreach ($mergedIndices as $m) {
unset($flattened[$m]);
}
// Re-index array after purging
$flattened = array_values($flattened);
}
echo '<pre>' . print_r($flattened, 1) . '</pre>';
看起来比我的解决方案更简单、更准确、更高效!感谢他们花时间提供帮助,我将试一试:)非常感谢!工作完美无瑕。太棒了,很高兴我能帮上忙。:)
function flatten($input) {
$output = [];
$i = 0;
foreach ($input as $name => $data) {
$output[$i] = [$name];
foreach ($data['friends'] as $friend) {
$output[$i][] = $friend;
}
$i++;
}
return $output;
}
$input = [
'Ted' => [
'friends' => [
'Sarah'
]
],
'John' => [
'friends' => [
'Peter',
'Sam'
]
],
'Peter' => [
'friends' => [
'John',
'Sam'
]
],
'Frank' => [
'friends' => [
'Bob',
'Sarah'
]
],
'Kevin' => [
'friends' => [
'Sally'
]
],
'Sam' => [
'friends' => [
'John',
'Peter'
]
],
'Bob' => [
'friends' => [
'Frank',
'Sarah'
]
],
'Sarah' => [
'friends' => [
'Frank',
'Bob',
'Ted',
'Jane'
]
],
'Sally' => [
'friends' => [
'Kevin'
]
],
'Jane' => [
'friends' => []
]
];
$flattened = flatten($input);
for ($i = 0; $i < count($flattened); $i++) {
$mergedIndices = [];
// Check for same friends among other groups than current one
for ($j = 0; $j < count($flattened); $j++) {
if ($i !== $j && count(array_intersect($flattened[$i], $flattened[$j])) > 0) {
// Found match between two groups, so merge them
$flattened[$i] = array_unique(array_merge($flattened[$i], $flattened[$j]));
$mergedIndices[] = $j;
}
}
// Purge merged items
foreach ($mergedIndices as $m) {
unset($flattened[$m]);
}
// Re-index array after purging
$flattened = array_values($flattened);
}
echo '<pre>' . print_r($flattened, 1) . '</pre>';
Array
(
[0] => Array
(
[0] => Ted
[1] => Sarah
[2] => Frank
[3] => Bob
[4] => Jane
)
[1] => Array
(
[0] => John
[1] => Peter
[2] => Sam
)
[2] => Array
(
[0] => Kevin
[1] => Sally
)
)