2013-05-21 91 views
5

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

假设我有数组$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)

编辑 我想,这是一个类似于位串组合虽然与不同数量的基础

+0

这不太合乎逻辑,因为对于某些组合是任意的。这将取决于前面的组合,以确定新组合是否合法。虽然仍然可以脱离过程。 –

+0

如果'placeholder

+0

对不起,想给个答案。开始在错误的领域。 –

回答

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. 然后,我提出的功能,s转换数据的这种大规模的量成字符串(不检查是否不重复)。

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 */); 

诗代码基于PHP5.4 +,要转换为较低,您需要将[]更改为array(),但我很喜欢新的语法,所以很抱歉:P