puede enumerar los elementos de la r conjunto de esult, es decir, para cada número entero entre 0 .... (número de elementos) -1, puede indicar qué elemento devolver (es decirhay un orden natural). Para el ejemplo dado:
0 => array1[0], array2[0], array3[0]
1 => array1[0], array2[0], array3[1]
2 => array1[0], array2[1], array3[0]
7 => array1[1], array2[1], array3[1]
Todo lo que necesita es un (número entero) índice de n y una función que "traduce" el índice a la ésimo elemento del conjunto (naturales ordenado) n. Como solo necesita un número entero para almacenar el estado actual, el consumo de memoria no "explota" cuando tiene muchas/grandes matrices. Como dijo Chris en su comentario, usted cambia la velocidad (cuando usa juegos más pequeños) para un bajo consumo de memoria. (Aunque creo -La forma php es implemented- esto también es una solución rápida razonable.)
$array1 = array('dog', 'cat');
$array2 = array('food', 'tooth');
$array3 = array('car', 'bike');
function foo($key /* , ... */) {
$params = func_get_args();
$rv = array();
$key = array_shift($params);
$i=count($params);
while(0 < $i--) {
array_unshift($rv, $params[$i][ $key % count($params[$i]) ]);
$key = (int)($key/count($params[$i]));
}
return $rv;
}
for($i=0; $i<8; $i++) {
$a = foo($i, $array1, $array2, $array3);
echo join(', ', $a), "\n";
}
Usted puede usar esto para poner en práctica, por ejemplo, un Iterator, un SeekableIterator o tal vez incluso una ArrayAccess (e invirtiendo de este modo el control en comparación con las soluciones recursivas, casi como un yield
en Python o Ruby)
<?php
$array1 = array('dog', 'cat', 'mouse', 'bird');
$array2 = array('food', 'tooth', 'brush', 'paste');
$array3 = array('car', 'bike', 'plane', 'shuttlecraft');
$f = new Foo($array1, $array2, $array3);
foreach($f as $e) {
echo join(', ', $e), "\n";
}
class Foo implements Iterator {
protected $data = null;
protected $limit = null;
protected $current = null;
public function __construct(/* ... */) {
$params = func_get_args();
// add parameter arrays in reverse order so we can use foreach() in current()
// could use array_reverse(), but you might want to check is_array() for each element.
$this->data = array();
foreach($params as $p) {
// <-- add: test is_array() for each $p -->
array_unshift($this->data, $p);
}
$this->current = 0;
// there are |arr1|*|arr2|...*|arrN| elements in the result set
$this->limit = array_product(array_map('count', $params));
}
public function current() {
/* this works like a baseX->baseY converter (e.g. dechex())
the only difference is that each "position" has its own number of elements/"digits"
*/
// <-- add: test this->valid() -->
$rv = array();
$key = $this->current;
foreach($this->data as $e) {
array_unshift($rv, $e[$key % count($e)]);
$key = (int)($key/count($e));
}
return $rv;
}
public function key() { return $this->current; }
public function next() { ++$this->current; }
public function rewind() { $this->current = 0; }
public function valid() { return $this->current < $this->limit; }
}
grabados
dog, food, car
dog, food, bike
dog, food, plane
dog, food, shuttlecraft
dog, tooth, car
dog, tooth, bike
[...]
bird, paste, bike
bird, paste, plane
bird, paste, shuttlecraft
(la secuencia parece estar bien ;-))
¿usted también quiere * * perro, gato * *, * * comida para perros, diente de perro * *, * * comida para gatos, gato de dientes * * o sólo las combinaciones de todas las matrices ¿conjunto? – Gordon
Simplemente la combinación de todas las matrices para este problema en particular, aunque eso también sería interesante de ver. – hookedonwinter
Si usted quiere ser capaz de trabajar con 100 matrices de tamaño 100, tendrá serios problemas de memoria que tratan de generar realmente una matriz. La cantidad de combinaciones es un número realmente enorme. Este es un producto cartesiano. Hace falta un iterador. Este enfoque intercambia tiempo por espacio, es más lento pero le permite mantenerse dentro de los límites de memoria. Publicaba un enlace, pero sería al sitio web de un miembro activo aquí. Si él no viene solo y responde, publicaré el enlace. Pero de lo contrario no quiero robar su gloria. – goat