php - metodos - algoritmos de agrupamiento clustering
¿Cómo obtener todas las combinaciones de múltiples matrices? (2)
¿Cuántas combinaciones hay?
Entonces, primero la pregunta ¿cuántas combinaciones hay? Y la respuesta es que tienes que multiplicar la cantidad de cada matriz entre sí.
Entonces (c = cantidad 1 ):
c matriz 1 * c matriz 2 * ... * c matriz n
Y específico para tu ejemplo:
c array 1 * c array 2 * c array 3 = 2 * 2 * 2 = 8
* 1 Y si se pregunta por qué elegí c por cantidad, debido a la función count () en php
Obtener todas las combinaciones juntas
¿Cómo obtenemos ahora todas las combinaciones con la cantidad de matrices que tenemos?
Recorrimos todas nuestras combinaciones, que ya tenemos (comenzando con una combinación, una "combinación vacía" ( $combinations = [[]];
)), y para cada combinación pasamos por nuestra próxima matriz de datos y combinamos cada combinación con cada información de entrada a una nueva combinación.
Ahora hacemos esto hasta que obtengamos la longitud deseada para cada combinación.
Entonces como un ejemplo:
Array with the elements (Empty array is ''[]''):
[
[1, 2],
[3, 4]
]
//↓ new combinations for the next iteration
│
array NAN*:
Combinations:
- [] │ -> []
│
array 1 [1,2]: ┌─────────────┤
│ │
Combinations: v v
- [] + 1 │ -> [1]
- [] + 2 │ -> [2]
│
array 2 [3,4]: ┌─────────────┤
│ │
Combinations: v v
- [] + 3 │ -> [3]
- [] + 4 │ -> [4]
- [1] + 3 │ -> [1,3] //desired length 2 as we have 2 arrays
- [1] + 4 │ -> [1,4] //desired length 2 as we have 2 arrays
- [2] + 3 │ -> [2,3] //desired length 2 as we have 2 arrays
- [2] + 4 │ -> [2,4] //desired length 2 as we have 2 arrays
//↑ All combinations here
* NAN: no es un número
Como puede ver en el ejemplo anterior, ahora tenemos todas las combinaciones con la longitud de la cantidad de todas las matrices que tenemos.
Pero para obtener solo las combinaciones con la longitud deseada, estamos sobrescribiendo la matriz de resultados en cada iteración, de modo que al final solo las combinaciones con la longitud esperada se encuentren en la matriz de resultados.
Código:
<?php
$array1 = array(1,2);
$array2 = array(4,5);
$array3 = array(7,8);
$combinations = [[]];
$data = [
$array1,
$array2,
$array3,
];
$length = count($data);
for ($count = 0; $count < $length; $count++) {
$tmp = [];
foreach ($combinations as $v1) {
foreach ($data[$count] as $v2)
$tmp[] = array_merge($v1, [$v2]);
}
$combinations = $tmp;
}
print_r($combinations);
?>
salida:
Array
(
[0] => Array
(
[0] => 1
[1] => 4
[2] => 7
)
//...
[7] => Array
(
[0] => 2
[1] => 5
[2] => 8
)
)
Para matrices asociativas, solo tiene que hacer una pequeña modificación, que es:
Primero asigne las teclas de arreglos a una variable con
array_keys()
, por ej.$keys = array_keys($data);
Use las teclas en el segundo bucle foreach para acceder a la matriz de datos, significa desde:
foreach ($data[$count] as $v2)
a:
foreach ($data[$keys[$count]] as $v2)
Suponiendo que tengo estas 3 matrices
$array1 = array(1,2);
$array2 = array(4,5);
$array3 = array(7,8);
Necesito esta salida
1 4 7
1 4 8
1 5 7
1 5 8
2 4 7
2 4 8
2 5 7
2 5 8
Uno de mis problemas es que mi variedad de array puede variar de 3 a 15 matrices diferentes y cada una de ellas puede estar vacía (podría agregar 0 para no estar vacía) o tener muchos valores. Si tengo una matriz vacía, también necesito contarla como una columna válida. Estos valores se usarán para llenar una base de datos en un orden específico.
¿Hay alguna manera de que pueda hacer esto?
<?php
$color = array(''Blue'',''Red'',''Black'',''Green'');
$size = array(''L'',''M'',''S'',''XL'',''XXL'');
$type = array(''Half selevs'',''full seleves'');
$options = [
$color,
$size,
$type,
];
$combinations = getCombinations($options);
print_r($combinations);
function getCombinations($options){
$combinations = [[]];
for ($count = 0; $count < count($options); $count++) {
$tmp = [];
foreach ($combinations as $v1) {
foreach ($options[$count] as $v2)
$tmp[] = array_merge($v1, [$v2]);
}
$combinations = $tmp;
}
return $combinations;
}
?>
Salida:
Array
(
[0] => Array
(
[0] => Blue
[1] => L
[2] => Half selevs
)
[1] => Array
(
[0] => Blue
[1] => L
[2] => full seleves
)
[2] => Array
(
[0] => Blue
[1] => M
[2] => Half selevs
)
[3] => Array
(
[0] => Blue
[1] => M
[2] => full seleves
)
[4] => Array
(
[0] => Blue
[1] => S
[2] => Half selevs
)
[5] => Array
(
[0] => Blue
[1] => S
[2] => full seleves
)
[6] => Array
(
[0] => Blue
[1] => XL
[2] => Half selevs
)
[7] => Array
(
[0] => Blue
[1] => XL
[2] => full seleves
)
[8] => Array
(
[0] => Blue
[1] => XXL
[2] => Half selevs
)
[9] => Array
(
[0] => Blue
[1] => XXL
[2] => full seleves
)
[10] => Array
(
[0] => Red
[1] => L
[2] => Half selevs
)
[11] => Array
(
[0] => Red
[1] => L
[2] => full seleves
)
[12] => Array
(
[0] => Red
[1] => M
[2] => Half selevs
)
[13] => Array
(
[0] => Red
[1] => M
[2] => full seleves
)
[14] => Array
(
[0] => Red
[1] => S
[2] => Half selevs
)
[15] => Array
(
[0] => Red
[1] => S
[2] => full seleves
)
[16] => Array
(
[0] => Red
[1] => XL
[2] => Half selevs
)
[17] => Array
(
[0] => Red
[1] => XL
[2] => full seleves
)
[18] => Array
(
[0] => Red
[1] => XXL
[2] => Half selevs
)
[19] => Array
(
[0] => Red
[1] => XXL
[2] => full seleves
)
[20] => Array
(
[0] => Black
[1] => L
[2] => Half selevs
)
[21] => Array
(
[0] => Black
[1] => L
[2] => full seleves
)
[22] => Array
(
[0] => Black
[1] => M
[2] => Half selevs
)
[23] => Array
(
[0] => Black
[1] => M
[2] => full seleves
)
[24] => Array
(
[0] => Black
[1] => S
[2] => Half selevs
)
[25] => Array
(
[0] => Black
[1] => S
[2] => full seleves
)
[26] => Array
(
[0] => Black
[1] => XL
[2] => Half selevs
)
[27] => Array
(
[0] => Black
[1] => XL
[2] => full seleves
)
[28] => Array
(
[0] => Black
[1] => XXL
[2] => Half selevs
)
[29] => Array
(
[0] => Black
[1] => XXL
[2] => full seleves
)
[30] => Array
(
[0] => Green
[1] => L
[2] => Half selevs
)
[31] => Array
(
[0] => Green
[1] => L
[2] => full seleves
)
[32] => Array
(
[0] => Green
[1] => M
[2] => Half selevs
)
[33] => Array
(
[0] => Green
[1] => M
[2] => full seleves
)
[34] => Array
(
[0] => Green
[1] => S
[2] => Half selevs
)
[35] => Array
(
[0] => Green
[1] => S
[2] => full seleves
)
[36] => Array
(
[0] => Green
[1] => XL
[2] => Half selevs
)
[37] => Array
(
[0] => Green
[1] => XL
[2] => full seleves
)
[38] => Array
(
[0] => Green
[1] => XXL
[2] => Half selevs
)
[39] => Array
(
[0] => Green
[1] => XXL
[2] => full seleves
)
)