- array_merge: documentation ( source)
- implode: documentation ( source)
- iterator_to_array: documentation ( source)
<?php
function powerSet(Iterator $iterator){
if(!$iterator->valid()){
return yield new EmptyIterator();
}
$one = $iterator->current();
$rest = new NoRewindIterator($iterator);
$rest->next();
foreach(powerSet($rest) as $set){
$set = iterator_to_array($set);
yield new ArrayIterator($set);
// why does this work
yield (function($set, $one){
yield from array_merge($set, [$one]);
})($set, $one);
// but this doesn't?
// yield (function($set, $one){
// yield from $set;
// yield $one;
// })($set, $one);
}
}
function baz(){
yield 1;
yield 2;
yield 3;
yield 4;
}
$sets = powerSet(baz());
foreach($sets as $i => $set){
echo $i+1 . " {";
$arr = iterator_to_array($set);
echo implode(", ", $arr);
echo "}\n";
}