从数组中创建每个可能组合的单词

时间:2011-03-02 13:52:26

标签: php arrays string

此刻我的思绪有点麻木,

假设我有这个数组:

Array
(
    [0] => foo
    [1] => bar
    [2] => love
)

我想创建一些可能的组合(减去一个val),

,例如

foo bar
bar love
foo love

而不是他们的对立面(但那更容易)

bar foo
love bar
love foo

当然阵列可以是更多元素,在这种情况下我想找到

Array
(
    [0] => foo
    [1] => bar
    [2] => love
    [3] => test
)

foo bar love
bar love test
love test foo

foo love test
bar test foo
love test bar

依旧......

任何想法?

谢谢!

4 个答案:

答案 0 :(得分:4)

function getAllCombinations($array){
    $combinations = array();
    foreach ($array as $x) 
        foreach ($array as $y) {
            if($x != $y && !in_array($y.' '.$x,$combinations ))
                array_push($combinations, $x.' '.$y);       
        }
    return $combinations ;
}

返回

Array
(
    [0] => foo bar
    [1] => foo love
    [2] => bar love
)

答案 1 :(得分:2)

我强烈建议你不要走那条路,因为生成它所需的算法的复杂性是O((n)!)所以这对于任何大于20个元素的数组都是不可行的。 10个元素阵列的事件将有3628800个阵列的可能组合,15 - 1307674368000为100 - 9e + 157(这是9和157个零)

嗯,我不想,但在这里。这将生成任何阵列(长度为n)的所有可能组合(具有n-1长度)。我不建议以超过7的数组长度运行它。

    $array = array('foo','bar','love','test');
function getAllCombinations($array)
{
    if (count($array)==1)
        return ($array);
    $res = array();
    foreach ($array as $i=>$val)
    {
        $tArray = $array;
        unset($tArray[$i]);
        $subRes = getAllCombinations($tArray);
        foreach ($subRes as $t)
        {
            $res[]= $val.' '.$t;
        }
    }
    return $res;
}

foreach ($array as $key=>$val)
{
    $tArray = $array;
    unset($tArray[$key]);
    $res = getAllCombinations($tArray);
    foreach ($res as $t)
        echo $t.'<br />';
}

如果你只使用数组中的4个元素并且没有重复,那么这里有更短更快的解决方案:

$array = array('foo','bar','love','test');
for ($i1=0; $i1<count($array);$i1++)
{
    for ($i2=$i1+1; $i2<count($array);$i2++)
    {
        for ($i3=$i2+1; $i3<count($array);$i3++)
        {
            echo $array[$i1].' '.$array[$i2].' '.$array[$i3].'<br />';  
        }   
    }   
}

如果按字母数字排序初始数组,结果将按字母数字顺序排序

答案 2 :(得分:1)

我不确定你想要得到什么,但我认为以下应该做的工作(如果你想做我想你想做的事):

for($i = 0; $i < sizeof($array); $i++) {
    $text = "";
    for ($j = 0; $j < sizeof($array); $j++) {
        if ($i != $j) {
            $text = $text." ".$array[$j];
        }
    }
    echo $text;
}

答案 3 :(得分:0)

您可以使用Math_Combinatorics包。

示例代码:

$combinatorics = new Math_Combinatorics;
$set = array(
'one'   => 'foo',
'two'   => 'bar',
'three' => 'love'
);
$combinations = $combinatorics->combinations($set, 2);
print_r($combinations);

2是要合并的单词数。

我的结果输出:

Array
(
  [0] => Array
    (   
        [one] => foo
        [two] => bar
    )
  [1] => Array
    (   
        [one] => foo
        [three] => love
    )
  [2] => Array
    (   
        [two] => bar
        [three] => love
    )
)