PHP数组元素的组合

时间:2013-05-21 07:59:27

标签: php arrays algorithm combinations

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

假设我有数组$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个包,但该包只适用于占位符大小<= count($a)

修改 我认为这个类似于位串组合,但具有不同的数字基础

2 个答案:

答案 0 :(得分:1)

我没有适合您的PHP源代码,但有些资源可能有用。

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

Delphi代码:combination without repetition of N elements without use for..to..do

维基文章here

答案 1 :(得分:0)

好吧,花了一些时间来解决这个问题。

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

1。 我在firsrt制作了一个包含所有可能值选项的数组。

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。 然后艰难的部分来了。检查重复项。这比预期的要困难,but found some good anser to it and refactored it for my use

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。 最后一步是将英特尔组合成一个新的功能: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