Sen 0 arasındaki her tamsayı için yani sonuç kümesinin elemanları, .... (eleman sayısı) numaralandırabilir -1 (yani doğal bir düzen vardır) dönmek için hangi elemanı söyleyebilirim. Verilen Örneğin:
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]
Tüm ihtiyacınız olan bir (tamsayı) endeksi n ve n (doğal sıralı) kümesinin eleman inci endeksi "çevirir" bir işlevdir. Sadece mevcut durumunu saklamak için bir tamsayı gerekir çünkü birçok / Büyük diziler olduğunda bellek tüketimi "patlayabilir" değildir. Chris yaptığı açıklamada söylediği gibi (küçük kümeleri kullanırken), düşük bellek tüketimi için hızını ticaret. (Bence-rağmen yolu php uygulanmaktadır-bu aynı zamanda bir makul hızlı bir çözümdür.)
$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";
}
Bunu uygulamak için kullanabilirsiniz örneğin bir Iterator, a SeekableIterator ya da belki de, bir ArrayAccess (ve böylece bir {gibi özyinelemeli çözeltiler, almost ile karşılaştırıldığında kontrol tersine çevrilmesi [(4)]}) Python ya da 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; }
}
baskılar
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
(Dizi ;-) ok gibi görünüyor)