3

我正在尝试创建允许我获取数组的所有组合以稍后生成列表的函数。但我的问题是,目前我的函数将“ab”视为与“ba”不同。我不知道如何用语言来解释它,但我想下面的图片举例说明了我试图实现的目标。

在此处输入图像描述

function everyCombination($array) {
  $arrayCount      = count($array);
  $maxCombinations = pow($arrayCount, $arrayCount);
  $returnArray     = array();
  $conversionArray = array();
  foreach ($array as $key => $value) {
    $conversionArray[base_convert($key, 10, $arrayCount)] = $value;
  }
  for ($i = 0; $i < $maxCombinations; $i++) {
    $combination = base_convert($i, 10, $arrayCount);
    $combination = str_pad($combination, $arrayCount, "0", STR_PAD_LEFT);
    $returnArray[] = strtr($combination, $conversionArray);
  }
  return $returnArray;
}

$a = everyCombination(array('a', 'b', 'c','d'));
print_r($a);

所需的输出将是

a
ab
abc
abcd
b
bc
bcd
c
cd
d
4

2 回答 2

1

您需要做的是递归地遍历数组,对于每个递归,您应该只遍历所有更大的元素。像这样:

function everyCombination($arr) {
    $combos = array();
    $len = count($arr);
    for( $i=0; $i<$len; $i++) {
        for( $j=$i+1; $j<=$len; $j++) {
            $combos[] = implode("",array_slice($arr,$i,$j-$i));
        }
    }
    return $combos;
}

示例调用:

everyCombination(['a','b','c','d']);

回报:

['a','ab','abc','abcd','b','bc','bcd','c','cd','d']
于 2013-10-10T14:11:22.977 回答
0

看来您是在追求连续的结果,所以在这里双循环会是更好的选择;递归需要更多的控制。

function combos($array)
{
    if (!$array) {
        return [];
    }

    $n = count($array);
    $r = [];

    for ($i = 0; $i < $n; ++$i) {
        $prefix = '';
        for ($j = $i; $j < $n; ++$j) {
            $r[] = $prefix . $array[$j];
            $prefix .= $array[$j];
        }
    }

    return $r;
}

print_r(combos([1, 2, 3, 4]));
于 2013-10-10T23:59:39.680 回答