Finding the subsets of an array in PHP
You wish for the power set of $attributes
? That is what your question implies.
An example can be found here (quoted for completeness)
<?php /** * Returns the power set of a one dimensional array, a 2-D array. * [a,b,c] -> [ [a], [b], [c], [a, b], [a, c], [b, c], [a, b, c] ]*/ function powerSet($in,$minLength = 1) { $count = count($in); $members = pow(2,$count); $return = array(); for ($i = 0; $i < $members; $i++) { $b = sprintf("%0".$count."b",$i); $out = array(); for ($j = 0; $j < $count; $j++) { if ($b{$j} == '1') $out[] = $in[$j]; } if (count($out) >= $minLength) { $return[] = $out; } } return $return; }
Using php array_merge we can have a nice short powerSet function
function powerSet($array) { // add the empty set $results = [[]]; foreach ($array as $element) { foreach ($results as $combination) { $results[] = array_merge(array($element), $combination); } } return $results;}
Here a backtracking solution.
given a function that returns all the L-lenght subsets of the input set, find all the L-lenght subsets from L = 2 to dataset input length
<?phpfunction subsets($S,$L) { $a = $b = 0; $subset = []; $result = []; while ($a < count($S)) { $current = $S[$a++]; $subset[] = $current; if (count($subset) == $L) { $result[] = json_encode($subset); array_pop($subset); } if ($a == count($S)) { $a = ++$b; $subset = []; } } return $result;}$S = [ 'A', 'B', 'C', 'D'];$L = 2;// L = 1 -> no need to do anythingprint_r($S);for ($i = 2; $i <= count($S); $i++) print_r(subsets($S,$i));