数组元素的PHP组合

数组元素的PHP组合,php,arrays,algorithm,combinations,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,2,3,3,3,3)相同,因此后者不计算在内 谁能给我指一下正确的方向吗?我知道有Math\u combinationicspea

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

假设我有数组
$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,2,3,3,3,3)
相同,因此后者不计算在内


谁能给我指一下正确的方向吗?我知道有
Math\u combinationics
pear
软件包,但该软件包仅适用于占位符大小
我没有PHP源代码可供您使用,但有些源代码可能会有所帮助

一些C代码。请看2.1:

Delphi代码:


维基文章

好吧,我花了一些时间才弄明白这一点

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

一,。 我首先制作了一个包含所有可能值选项的数组

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;
}
三,。 然后困难的部分来了。检查有无重复。这比预期的要难

四,。 最后一步是将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

这不太符合逻辑,因为某些组合是任意的。新的合并是否合法取决于之前的合并。虽然仍然可行。如果
占位符
,怎么办?对不起,我想给出一个答案。从错误的领域开始。@OfirBaruch:我就知道是这样。这确实需要太多的时间。我不会回答。抱歉,没有那么多时间。@nl-x,因为有时占位符可能大于
count($a)
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 */);