2014-03-24 32 views
-1

我很难考虑解决这个问题(也许是因为它是星期一)。我有多个用户成员数组(电子邮件地址),我想将它们分成独特的组。将多个阵列拆分为独特的组

数据举例:

$members = array(
    'Group One' => array(
     'User A', 
     'User B', 
     'User C', 
     'User D' 
    ), 
    'Group Two' => array(
     'User A', 
     'User B', 
     'User D' 
    ), 
    'Group Three' => array(
     'User A', 
     'User E' 
    ) 
);  

现在我想将它们分开成唯一的组,并有结果是这样的:

Array (
    0 => Array (
     'Groups' => Array (
      0 => 'Group One' 
     ), 
     'Members' => Array (
      0 => 'User C' 
     ) 
    ), 
    1 => Array (
     'Groups' => Array (
      0 => 'Group One', 
      1 => 'Group Two' 
     ), 
     'Members' => Array (
      0 => 'User B', 
      1 => 'User D' 
     ) 
    ), 
    2 => Array (
     'Groups' => Array (
      0 => 'Group One', 
      1 => 'Group Two', 
      2 => 'Group Three' 
     ), 
     'Members' => Array (
      0 => 'User A' 
     ) 
    ), 
    3 => Array (
     'Groups' => Array (
      0 => 'Group Three' 
     ), 
     'Members' => Array (
      0 => 'User E' 
     ) 
    ) 
) 
+0

请_verbally_形容这是什么逻辑你的“分组”应做。 – CBroe

回答

1

看起来像这是做你想做的。 我们将所有独特的组合组合到$ pool数组中。在getValues函数中,我们从$ a中获得每个组中存在的值(与数组相交)中的值,并且我们只从$ b中的其他组(具有数组合并)中获取所有值。然后,我们只返回出现在每个组池中的用户,而不是用array_diff返回任何其他组中的用户。

<?php 

$members = array(
    'Group One' => array(
     'User A', 
     'User B', 
     'User C', 
     'User D' 
    ), 
    'Group Two' => array(
     'User A', 
     'User B', 
     'User D' 
    ), 
    'Group Three' => array(
     'User A', 
     'User E' 
    ) 
); 

$keys = array_keys($members); 
$len = count($keys); 

function getValues(&$result = array(), $members, $pool) { 
    $a = null; 
    $b = array(); 
    foreach ($members as $group => $values) { 
     if (in_array($group, $pool)) { 
      $a = (null === $a) ? $values : array_intersect($a, $values); 
     } else { 
      $b = array_merge($b, $values); 
     } 
    } 

    if ($ret = array_diff($a, $b)) { 
     $result[] = array(
      'Groups' => $pool, 
      'Members' => array_values($ret), 
     ); 
    } 
} 

for ($i = 0; $i < $len; ++$i) { 
    $pool = array($keys[$i]); 
    for ($j = $i; $j < $len; ++$j) { 
     if ($j > $i) { 
      $pool[] = $keys[$j]; 
     } 
     getValues($result, $members, $pool); 
    } 
} 

print_r($result); 

这里是输出:

Array 
(
    [0] => Array 
     (
      [Groups] => Array 
       (
        [0] => Group One 
       ) 

      [Members] => Array 
       (
        [0] => User C 
       ) 

     ) 

    [1] => Array 
     (
      [Groups] => Array 
       (
        [0] => Group One 
        [1] => Group Two 
       ) 

      [Members] => Array 
       (
        [0] => User B 
        [1] => User D 
       ) 

     ) 

    [2] => Array 
     (
      [Groups] => Array 
       (
        [0] => Group One 
        [1] => Group Two 
        [2] => Group Three 
       ) 

      [Members] => Array 
       (
        [0] => User A 
       ) 

     ) 

    [3] => Array 
     (
      [Groups] => Array 
       (
        [0] => Group Three 
       ) 

      [Members] => Array 
       (
        [0] => User E 
       ) 

     ) 

) 
+0

工程很好,我很惊讶,结果与我的预测一样。 – mgraphic

0

它可能不是最好的解决办法,但这应该工作。 首先,创建一个帮助程序阵列,按用户而不是按组来分组数据,以找出每个用户的组合。然后,遍历结果数组并生成结果。

$members = array(
    'Group One' => array(
     'User A', 
     'User B', 
     'User C', 
     'User D' 
    ), 
    'Group Two' => array(
     'User A', 
     'User B', 
     'User D' 
    ), 
    'Group Three' => array(
     'User A', 
     'User E' 
    ) 
); 

$uniqueGroups = array(); 
$groupedByUser = array(); 
foreach($members as $group => $users) { 

    foreach($users as $user) { 

     if(!is_array($groupedByUser[$user])) { 
      $groupedByUser[$user] = array(); 
     } 
     $groupedByUser[$user][] = $group; 
    } 

} 

foreach($groupedByUser as $user => $groups) { 

    sort($groups); 
    $found = FALSE; 
    foreach($uniqueGroups as $idx=>&$infos) { 
     $currentGroups = $infos['Groups']; 
     $diff = array_diff($currentGroups, $groups); 
     if(empty($diff)) { 
      $infos['Users'][] = $user; 
      $found = TRUE; 
     } 
    } 
    if(!$found) { 
     $uniqueGroups[] = array(
      'Groups' => $groups, 
      'Users' => array($user) 
     ); 
    } 

} 

print_r($uniqueGroups); 
+0

在我的结果中,一些组类型被发现不止一次。 – mgraphic