Search code examples
phparrayssetset-theory

Finding the intersections of array and create a new set of arrays


Im looking the build a new array by finding the intersection of a given array of arrays.

This probably a simple set theory problem for most people but its kind of hard for me to wrap my head around.

So I have a keyed array:

$myArray = [
 'array1' => [A, B, C],
 'array2' => [A, B, C, D],
 'array3' => [A, B, C, D],
 'array4' => [D],
]

And the goal is to build an entirely new array keyed in with concatenated keys of the previous array if they have an intersection:

Basically like this:

 $newArray = [
   'array1,array2,array3' => [A, B, C],
   'array2,array3,array4' => [D]
  ]

Since array1, array2, array3 have ABC in command they will form as one keyed array, same as array2,array3,array4 and so on.

I have tried to experiment with array_intersect but it seems like its not the one that im looking for or perhaps I solving it in a really wrong way. Any ideas is much appreciated.

$myArray = [
 'array1' => [A, B, C],
 'array2' => [A, B, C, D],
 'array3' => [A, B, C, D],
 'array4' => [D],
];


$newArray = [];
$keys = array_keys($myArray);

for($i = 0, $size = count($myArray); $i < $size; $i++){
  for($k = $i; $k < $size; $k++){
      print_r(array_intersect($myArray[$keys[$i]], $myArray[$keys[$k]]));    
   }
}

  //Foal 
  // 'array1,array2,array3' => [A, B, C]
  // 'array2,array3,array4' => [D]

Solution

  • This code will give the desired array as output.

    $myArray = [
     'array1' => ['A', 'B', 'C'],
     'array2' => ['A', 'B', 'C', 'D'],
     'array3' => ['A', 'B', 'C', 'D'],
     'array4' => ['D'],
    ];
    // Define new arrays
    $newArray = [];
    $finalArray = [];
    
    // loop the array and create a new array with values like (A,B,C..) as keys 
    foreach($myArray as $key=>$value){
        foreach($value as $k=>$v){
            // if already value exists append new value with comma
            $newArray[$v] = isset($newArray[$v]) ? $newArray[$v].','.$key:$key;
        }
    }
    foreach($newArray as $key=>$value){
            $finalArray[$value][] = $key;
    
    }
    print_r($finalArray);
    

    Out put is

    Array
    (
        [array1,array2,array3] => Array
            (
                [0] => A
                [1] => B
                [2] => C
            )
    
        [array2,array3,array4] => Array
            (
                [0] => D
            )
    
    )