У меня есть два массива в 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 * смассив 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
)
)
)
это 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);
Если у вас есть лучшее решение, то, пожалуйста, улучшите его