PHP, сделать со всеми другими значениями массива

Я должен сделать сложный массив с другими значениями массива.

Исходный массив:

Array (
[0] => Array (
[0] => A
[1] => B
[2] => C
)

[1] => Array (
[0] => D
[1] => E
[2] => F
)
)

Я ищу функцию, которая дает мне все возможные значения комбинаций, например:

Array (
[0] => Array (A, D),
[1] => Array (A, E),
[2] => Array (A, F),
[3] => Array (B, D),
[4] => Array (B, E),
[5] => Array (B, F),
[6] => Array (C, D),
[7] => Array (C, E),
[8] => Array (C, F)
)

Конечно, этот алгоритм должен работать, даже если числа значений в исходном массиве отличаются.

Я ищу простую функцию в документации PHP для этого, но я не нашел ее.

Я прогуглил это с ключевыми словами как «мультиплекс» или «объединить», но без удачи. Я думаю, что лучший способ — создать рекурсивную функцию, но я не могу найти правильный алгоритм.

4

Решение

Простая рекурсивная функция для вычисления декартового произведения:

function cartesian(array $data)
{
function cartesian_r(array $data, array $path, &$out)
{
if (count($data) > 1) {
// recursive step
$head = array_slice($data, 0, -1);
$tail = end($data);
foreach ($tail as $item) {
cartesian_r($head, array_merge($path, [$item]), $out);
}
} else {
// unwind step
foreach ($data[0] as $item) {
$out[] = array_merge([$item], $path);
}
}
}

$out = [];
cartesian_r($data, [], $out);

return $out;
}

$out = cartesian([['A', 'B'], ['C', 'D'], ['E', 'F']]);

print_r($out);

Выход

Array
(
[0] => Array
(
[0] => A
[1] => E
[2] => C
)

[1] => Array
(
[0] => B
[1] => E
[2] => C
)

[2] => Array
(
[0] => A
[1] => E
[2] => D
)

[3] => Array
(
[0] => B
[1] => E
[2] => D
)

[4] => Array
(
[0] => A
[1] => F
[2] => C
)

[5] => Array
(
[0] => B
[1] => F
[2] => C
)

[6] => Array
(
[0] => A
[1] => F
[2] => D
)

[7] => Array
(
[0] => B
[1] => F
[2] => D
)

)
3

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

Всего два foreach

$first = array('A', 'B', 'C', 'D');
$second = array('E', 'F', 'G');

$result = array();
foreach ($first as $f) {
foreach ($second as $s) {
$result[] = array($f, $s);
}
}
var_dump($result);
2

Это работает для стольких sub_arrays, сколько вы захотите … оно не упорядочено как исходный вывод, но это можно легко исправить с помощью функции сортировки, как в примере:

 $input = array(
0 => array ('A','B','C'),
1 => array ('D','E','F'),
2 => array ('X','Y','Z'),
/*...*/
);

$result = array();
foreach($input as $sub_arr){
$_result = array();
foreach($sub_arr as $val){
if($result){
foreach($result as $old){
$old[] = $val;
$_result[] = $old;
}
}else{
$_result[] = array($val);
}
}
$result = $_result;
}
array_multisort($result); //sort all layers alphabetically.
echo "<pre>";
print_r($result);

Рабочий пример: скрипка

1

Это самая простая динамическая вещь, которую я мог представить:

Отображается «ВСЕ ВОЗМОЖНЫЕ КОМБИНАЦИИ»

<?php

$origArray = array(
array(
"A",
"B",
"C"),
array(
"D",
"E",
"F")
);

$endArray = array();

foreach ($origArray as $key_1 => $value_1){
foreach ($origArray as $key_2 => $value_2){
if($key_1 == $key_2){
continue;
}
foreach($value_1 as $key_1_1 => $value_1_1 ){
foreach ($value_2 as $key_2_1 => $value_2_1){
$endArray[] = array($value_1_1, $value_2_1);
}
}}

}
echo "<pre>";
var_dump($endArray);
echo "</pre>";

Если вы хотите отобразить все комбинации подмассива firts, вы можете использовать:

<?php

$origArray = array(
array(
"A",
"B",
"C"),
array(
"D",
"E",
"F")
);

$endArray = array();

foreach ($origArray as $key_1 => $value_1){
foreach($origArray[0] as $key_1_1 => $value_1_1 ){
if($key_1 == 0 ){
continue;
}
foreach ($value_1 as $key_2_1 => $value_2_1){

$endArray[] = array($value_1_1, $value_2_1);
}
}
}
echo "<pre>";
var_dump($endArray);
echo "</pre>";
0