5

我想生成所有可能的数组元素组合来填充占位符,占位符的大小可能会有所不同。

假设我有数组$a = array(3, 2, 9, 7),占位符大小为6. 我想生成如下内容:

3,3,3,3,3,3
2,3,3,3,3,3
2,2,3,3,3,3
...........
...........
7,7,7,7,7,9
7,7,7,7,7,7

但是(2,3,3,3,3,3),将被视为相同,(3,2,3,3,3,3)因此后一个不计算在内。

谁能指出我正确的方向?我知道有Math_Combinatorics pear包,但那个只适用于 placeholder size <= count($a)

编辑 我认为这类似于位字符串组合,尽管具有不同的数字基数

4

2 回答 2

1

我没有给你的 PHP 源代码,但有一些可能有帮助的源代码。

一些C代码。看2.1: http ://www.aconnect.de/friends/editions/computer/combinatoricode_g.html

Delphi代码:不重复N个元素的组合不使用for..to..do

维基文章在这里

于 2013-05-21T08:51:59.170 回答
0

好吧,花了一些时间才弄清楚这一点。

所以我把问题分成多个部分

1. 我首先创建了一个包含所有可能值选项的数组。

function create_all_array($placeholder, array $values)
{
    if ($placeholder <= 0) {
        return [];
    }

    $stack = [];
    $values = array_unique($values);

    foreach ($values as $value) {
        $stack[] = [
            'first' => $value,
            'childs' => create_all_array($placeholder - 1, $values)
        ];
    }

    return $stack;
}

2. 然后我做了一个函数来将大量数据转换成字符串(不检查唯一性)。

function string($values, $prefix = '')
{
    $stack = [];

    foreach($values as $value) {
        $sub_prefix = $prefix . $value['first'];

        if (empty($value['childs'])) {
            $stack[$sub_prefix] = (int)$sub_prefix;
        } else {
            $stack = array_merge($stack, string($value['childs'], $sub_prefix));
        }
    }

    return $stack;
}

3. 然后困难的部分来了。检查重复项。这比预期的要难,但找到了一些很好的分析器并对其进行了重构以供我使用

function has_duplicate($string, $items)
{
    $explode = str_split ($string);
    foreach($items as $item) {
        $item_explode = str_split($item);

        sort($explode);
        $string = implode('',$explode);
        sort($item_explode);
        $item = implode($item_explode);

        if ($string == $item) {
            return true;
        }
    }

    return false;
}

4.最后一步是将intel组合成一个新的功能:P

function unique_string($placeholder, array $values)
{
    $stack = string(create_all_array($placeholder, $values));

    $check_stack = [];
    foreach($stack as $key => $item) {
        if (has_duplicate($item, $check_stack)) {
            unset($stack[$key]);
        }
        $check_stack[] = $item;
    }
    return $stack;
}

现在你可以简单地使用它,如下所示

unique_string(3 /* amount of dept */, [1,2,3] /* keys */);

Ps 代码基于 PHP5.4+,要转换为更低,您需要更改为[]array()但我喜欢新语法,非常抱歉:P

于 2013-05-21T10:01:08.423 回答