【问题标题】:PHP combinations of array elements数组元素的PHP组合
【发布时间】: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)

标签: php arrays algorithm combinations


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 2020-03-16
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多