php从multidimentional数组中获取所有有效组合

时间:2017-09-21 14:28:21

标签: php arrays

我有一个表示键中允许值的数组。这个数组的长度是动态的

array(
 10=>array(100,101,102),
 11=>array(100,104),
 12=>array(100,102,103)
)

在这个例子中,键10可以有100,101和102.

我希望获得所有有效组合,其中每个值只出现一次

array(
   array(10=>array(100,101,102),11=>array(104),12=>array(103)),
   array(10=>array(100,101),10=>array(104),12=>array(102,103)),
   array(10=>array(101),10=>array(100,104),12=>array(102,103)),
   array(10=>array(101),10=>array(104),12=>array(100,102,103)),
   AND SO ON
)

1 个答案:

答案 0 :(得分:0)

他们希望您为每个索引找到power sets,然后计算这些集的功率集。

此代码允许您计算每个索引的功率集。它应该让你开始并让你知道如何完成其​​余的问题。

function power_set($arr)
{
    $sets = [];

    for ($i = 0; $i < pow(2, count($arr)); $i++) {
        $set = [];
        for ($j = 0; $j < count($arr); $j++) {
            if ($i & (1 << $j)) {
                $set[] = $arr[$j];
            }
        }
        if (count($set) > 0) {
            $sets[] = $set;
        }
        $set = [];
    }
    return $sets;
}

输出

array(7) {
  [0] =>
  array(1) {
    [0] =>
    int(100)
  }
  [1] =>
  array(1) {
    [0] =>
    int(101)
  }
  [2] =>
  array(2) {
    [0] =>
    int(100)
    [1] =>
    int(101)
  }
  [3] =>
  array(1) {
    [0] =>
    int(102)
  }
  [4] =>
  array(2) {
    [0] =>
    int(100)
    [1] =>
    int(102)
  }
  [5] =>
  array(2) {
    [0] =>
    int(101)
    [1] =>
    int(102)
  }
  [6] =>
  array(3) {
    [0] =>
    int(100)
    [1] =>
    int(101)
    [2] =>
    int(102)
  }
}

我注意到的一件事是,你不包括集合没有元素的情况。技术上应该包括在内,所以我会检查以确保您的样本输出是正确的。我修改了算法以排除这种情况,但我认为应该包括它。

如果要包含它,请删除检查$set中元素数量的if语句。