数组元素的PHP组合

Posted

技术标签:

【中文标题】数组元素的PHP组合【英文标题】:PHP combinations of array elements 【发布时间】:2013-05-15 22:05:15 【问题描述】:

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

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

编辑 我在想这个类似于位串组合,尽管具有不同的数字基数

【问题讨论】:

这不太合乎逻辑,因为有些组合是任意的。这将取决于前面的组合来确定一个新的组合是否合法。虽然仍然可行。 如果placeholder < count($a) 怎么办? 抱歉,想回答一下。从错误的领域开始。 @OfirBaruch:我知道是这样。确实会花费太多时间。不会给出答案。抱歉,没有那么多时间。 @nl-x 因为有时占位符可能大于count($a) 【参考方案1】:

我没有给你的 php 源代码,但有一些资源可能会有所帮助。

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

德尔福代码:combination without repetition of N elements without use for..to..do

维基文章here

【讨论】:

【参考方案2】:

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

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

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。 然后困难的部分来了。检查重复项。这比预期的要难,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。 最后一步是将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

【讨论】:

以上是关于数组元素的PHP组合的主要内容,如果未能解决你的问题,请参考以下文章

在PHP中查找数组元素的所有可能的唯一组合[重复]

PHP 查找数组的所有元素组合

php实现全组合算法

PHP在相似元素上组合数组

php中x pow y的所有组合

如何在 PHP 中生成多个数组中的所有项目组合