2012-08-29 46 views
-1

我需要帮助循环,通过一个简单的数组,找到它的元素这样所有可能的组合的所有可能的组合:迭代通过一个数组来找到重复

array('a', 'b', 'c'); 

预期的结果是:

array(
    0=>array('a', 'a', 'a'), 
    1=> array('a', 'a', 'b') 
); 

我完全失败,任何帮助或指针非常感谢!

这是我到目前为止。

$array = array('red', 'blue', 'green', 'white'); 
$count = count($array); 

$current = array_fill(0, $count, $array[0]); 
$last = array_fill(0, $count, end($array)); 


$output = array(); 
$i = 0; 

while ($current != $last) { 
    $indexes = str_pad($i, $count, "0", STR_PAD_LEFT); 

    $j = str_split($indexes); 

    foreach ($j as $a => $b) { 
     if (isset($array[$b])) { 
      $output[$i][] = $array[$b]; 
     } 
    } 
    $current = $output[$i]; 
    $i++; 
} 
// cleaver duplication removal 
$result = array_map("unserialize", array_unique(array_map("serialize", $output))); 

echo '<pre>'; 
    print_r($result); 
echo '</pre>'; 

重复的删除密码从here

+2

您好,欢迎StackOverflow上。尽管您的计划可能会遇到麻烦,但我们强烈建议(并坚持)在向社区寻求帮助之前,您已尽其最大努力。很明显,您遇到了您尝试过的代码问题,我们很乐意提供帮助!如果您没有花费精力设计自己的解决方案,我们倾向于对您的问题进行降级投票并关闭它。你必须至少尝试一个解决方案。绝不要求别人写代码来代替诚实的努力。总之,[你试过什么](http://www.whathaveyoutried.com)? – Matt

+0

嗨马特。对不起,我的工作没有包括在问题中。我将其添加为答案之一。它的作品,但它确实是一个非常懒惰的方式去,没有切割和幻想。如果源数组很大,它可能会超出内存限制。 – user389767

+0

您需要遍历数组,递归地检查指针右侧的元素与当前元素的可能组合。被警告,这将需要时间和记忆与n大致成比例!所以不要在大型​​数组上使用它。 –

回答

1
function pc_permute($items, $perms = array()) { 
    if (empty($items)) { 
     print join(' ', $perms) . "\n"; 
    } else { 
     for ($i = count($items) - 1; $i >= 0; --$i) { 
      $newitems = $items; 
      $newperms = $perms; 
      list($foo) = array_splice($newitems, $i, 1); 
      array_unshift($newperms, $foo); 
      pc_permute($newitems, $newperms); 
     } 
    } 
} 

Source.

+0

感谢排列功能。然而,我不是在寻找排列,我需要重复。这是一个很好的开始。 – user389767