Как получить все возможные пересечения нескольких многомерных массивов?

У меня есть два массива в PHP, как это:

$array1 = array(array("1", "3", "4"), array("1", "4"));
$array2 = array(array("5", "4", "3", "2"), array("5", "3"));

Теперь я хочу получить все возможные пересечения этих двух многомерных массивов. Значит, я бы получил всего 4 массива:

  • $array1[0] & $array2[0]
  • $array1[1] & $array2[0]
  • $array1[0] & $array2[1]
  • $array1[1] & $array2[1]

Я могу получить пересечение из одномерного массива, используя array_intersect(), Но как я могу получить все возможные пересечения нескольких многомерных массивов?

1

Решение

Здесь мы создаем массив, содержащий все комбинации массивов, чтобы позже мы могли взять пересечения этих массивов.

Комбинации массивов

Сначала нам нужно создать все возможные комбинации массивов. Который:

смассив 1 * смассив 2 * … * смассив n

«с» просто означает count() массивов

Так что в вашем конкретном примере это будет:

смассив 1 * смассив 2 => 2 * 2 => 4 комбинации

Теперь нам нужно получить все эти комбинации и поместить их в массив. Для этого начнем с пустого $combinations массив. Затем мы перебираем все комбинации, которые есть в массиве, и сливаем в него следующий массив, пока не получим желаемую длину комбинации, в данном случае количество массивов, которое у нас есть.

Итак, в качестве примера:

Array with the elements (Empty array is '[]'):

[
[[1, 3, 4], [1, 4]],     //array 1
[[5, 4, 3, 2], [5, 3]],  //array 2
]

           1* combination array    2* new array     //↓new combinations
↓                   ↓           //↓for the next iteration
│
array NAN*:

Combinations:
- []                              │  -> []
│
array 1:            ┌──────────────────────────────────┘
│
Combinations:   v
- []             + [1, 3, 4]      │  -> [[1, 3, 4]]
- []             + [1, 4]         │  -> [[1, 4]]
│
array 2:            ┌──────────────────────────────────┘
│
Combinations:   v
- [[1, 3, 4]]    + [5, 4, 3, 2]   │  -> [[1, 3, 4], [5, 4, 3, 2]]
- [[1, 3, 4]]    + [5, 3]         │  -> [[1, 3, 4], [5, 3]]
- [[1, 4]]       + [5, 4, 3, 2]   │  -> [[1, 4], [5, 4, 3, 2]]
- [[1, 4]]       + [5, 3]         │  -> [[1, 4], [5, 3]]
//↑ All combinations here

* NAN: не номер

Итак, как вы можете видеть в приведенном выше примере, у нас теперь есть все комбинации с длиной количества всех имеющихся у нас массивов (4 комбинации с длиной 2 элемента).

Код для получения комбинаций, как показано в примере выше:

// цикл for гарантирует, что мы получим желаемую длину каждой комбинации
// (Количество массивов, которые у нас есть. Здесь 2)
для ($ count = 0, $ length = count ($ data); $ count < $ Длины; $ count ++) {

$ tmp = [];

foreach ($ комбинаций как $ v1) {  // 1 * массив комбинаций

foreach ($ data [$ count] как $ v2)  // 2 * новый массив
$ tmp [] = array_merge ($ v1, [$ v2]); // Создание новых комбинаций

}

$ комбинаций = $ tmp; // Назначаем новые комбинации для следующей итерации

}

Который в вашем конкретном примере генерирует этот массив:

Array
(
[0] => Array  //Combination 1
(
[0] => Array
(
[0] => 1
[1] => 3
[2] => 4
)

[1] => Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 2
)

)

[1] => Array  //Combination 2
(
[0] => Array
(
[0] => 1
[1] => 3
[2] => 4
)

[1] => Array
(
[0] => 5
[1] => 3
)

)

[2] => Array  //Combination 3
(
[0] => Array
(
[0] => 1
[1] => 4
)

[1] => Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 2
)

)

[3] => Array  //Combination 4
(
[0] => Array
(
[0] => 1
[1] => 4
)

[1] => Array
(
[0] => 5
[1] => 3
)

)

)
3

Другие решения

это foreach решает мою проблему

$array1= array(array("1","3","4"),array("1","4"));
$array2= array(array("5","4","3","2"),array("5","3"));
$result = array();
echo "<pre>";
foreach($array1 as $array1)
{
foreach($array2 as $array3)
{
print_r($array3);
$result[] = array_intersect($array1,$array3);
}
}

print_r($result);

Если у вас есть лучшее решение, то, пожалуйста, улучшите его

1