此刻我的思绪有点麻木,
假设我有这个数组:
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
依旧......
任何想法?
谢谢!
答案 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
)
)