Tras mucho buscar en foros y no encontrar nada que cumpliera con nuestra necesidad, se procedió a realizar una clase que nos permitiera generar combinaciones de arreglos de sin repetir combinaciones y de forma dinámica, es decir, podemos generar combinaciones a partir de dos arreglos o de N cantidad de arreglos.
Lo primero será crear la clase Combinations con el siguiente código:
class Co {
public $combinations = array(),
$temp = array();
public function __construct() {}
public function combinate($arrays, $i = 0) {
if (count($this->temp) > 0) {
foreach ($this->temp as $ck => $c) {
$nc = array();
foreach ($arrays[$i] as $vk => $v) {
foreach ($c as $cv) {
if (is_array($cv)) {
$nc[] = array_merge($cv, array($v));
} else {
$nc[] = array($cv, $v);
}
}
}
$this->temp[$ck] = $nc;
}
if ($i == count($arrays) - 1) {
foreach ($this->temp as $t) {
$this->combinations = array_merge($this->combinations, $t);
}
}
} else {
foreach ($arrays[$i] as $v) {
$this->temp[] = array($v);
}
}
$next = $i + 1;
if (isset($arrays[$next])) {
$this->combinate($arrays, $next);
}
}
}
El método que hace la magia es el combinate() el cual recibe como parámetro obligatorio un arreglo en dónde se contengan los arreglos a combinar y un parámetros $i el cual nos ayuda a identificar en qué iteración se encuentra.
A continuación les comparto un ejemplo de como usarlo:
// Arreglos para generar combinaciones entre sus elementos
$arrays = array(
array("1", "2", "3", "4"),
array("a", "b", "c")
);
// Crear combinaciones
$c = new Co();
$c->combinate($arrays);
// Impresión de resultados
echo PHP_EOL . "R: " . count($c->combinations) . PHP_EOL;
foreach ($c->combinations as $arr) {
echo print_r($arr, 1) . PHP_EOL;
}
Este ejemplo nos dará la siguiente salida:
R: 12
Array
(
[0] => 1
[1] => a
)
Array
(
[0] => 1
[1] => b
)
Array
(
[0] => 1
[1] => c
)
Array
(
[0] => 2
[1] => a
)
Array
(
[0] => 2
[1] => b
)
Array
(
[0] => 2
[1] => c
)
Array
(
[0] => 3
[1] => a
)
Array
(
[0] => 3
[1] => b
)
Array
(
[0] => 3
[1] => c
)
Array
(
[0] => 4
[1] => a
)
Array
(
[0] => 4
[1] => b
)
Array
(
[0] => 4
[1] => c
)
Si lo que requieren es añadir más arreglos para generar combinaciones, basta con agregarlos de la siguiente forma:
$arrays = array(
array("1", "2", "3", "4"),
array("a", "b", "c", "d", "e"),
array("=", "(", ")"),
array(">", "<", "::"),
);
Cómo pueden ver, la función funciona completamente de forma dinámica, así que úsenla sabiamente para no saturar al servidor.