Finding the subsets of an array in PHP Finding the subsets of an array in PHP php php

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));