Как называется операция «объединить каждого с каждым»? - PullRequest
2 голосов
/ 14 ноября 2010

У меня есть матрица, представленная в PHP как массив:

array(
    array('a','b'),   //   a | b
    array('c','d')    //   c | d
)

и у меня вторая матрица представлена ​​аналогичным образом (здесь без внутренних массивов, но я не против добавить их):

array(
    'e',              //   e
    'f'               //   f
)

Я хотел бы иметь такую ​​комбинацию:

array(
    array('a','b','e'),   //   a | b | e
    array('c','d','e')    //   c | d | e
    array('a','b','f'),   //   a | b | f
    array('c','d','f')    //   c | d | f
)

Я пытался найти фрагмент кода, который делает это для меня, но мне это не удалось, потому что я даже не знаю, есть ли у такого рода операции имя. Имеет это?

(Я не хочу, чтобы кто-нибудь писал этот фрагмент кода, я могу сделать это сам.)

Ответы [ 2 ]

2 голосов
/ 14 ноября 2010

То, что вы ищете, называется декартовым произведением. Для вычисления этого не существует встроенной функции PHP.

0 голосов
/ 24 февраля 2011

На всякий случай, если кто-то еще хочет реализовать, следующее создаст декартово произведение двух массивов:

$cartesian_product_values = array();
$cartesian_product_arrays = array();
foreach($array1 as $a1) {
    foreach($array2 as $a2) {
        //Concatenate values in arrays
        $cartesian_product_values[] = $a1.$a2;
        $cartesian_product_values[] = $a2.$a1;
        //Or merge arrays
        $cartesian_product_arrays[] = array_merge($a1, $a2);
    }
}

И дополнительно, если вам нужны значения из $ array1и $ array2 в конечном массиве, вы можете объединить два массива перед тем, как вложенные циклы foreach:

$cartesian_product = array_merge($array1, $array2);
foreach($array1 as $a1) {
    foreach($array2 as $a2) {
        array_push($cartesian_product, $a1.$a2);
        array_push($cartesian_product, $a2.$a1);
    }
}
...