Создать пары слов в каждой возможной комбинации из массива - PullRequest
2 голосов
/ 02 марта 2011

В данный момент мой разум немного оцепенел,

предположим, у меня есть этот массив:

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

Я бы хотел создать пары возможных комбинаций (минус одно значение),

, например,

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 ]

4 голосов
/ 10 октября 2012
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
)
2 голосов
/ 02 марта 2011

Я настоятельно рекомендую вам не идти по этому пути, поскольку сложность алгоритма, необходимого для его генерации, составляет O ((n)!), Поэтому это невозможно для любых массивов, превышающих 20 элементов.Событие для массива из 10 элементов будет 3628800 возможных комбинаций для массива с 15 - 1307674368000 для 100 - 9e + 157 (это 9 и 157 нулей)

Ну, я не хотел, но здесь это,Это сгенерирует все возможные комбинации (с n-1 длиной) любого массива (длина n).Я бы не рекомендовал запускать его с длиной массива более 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 />';  
        }   
    }   
}

если вы сортируете исходный массив буквенно-цифровым образом, результат будет также упорядочен буквенно-цифровым образом

1 голос
/ 02 марта 2011

Я не уверен, что именно вы хотите получить, но я думаю, что следующее должно сделать работу (если вы хотите сделать то, что я думаю, что вы хотите):

for($i = 0; $i < sizeof($array); $i++) {
    $text = "";
    for ($j = 0; $j < sizeof($array); $j++) {
        if ($i != $j) {
            $text = $text." ".$array[$j];
        }
    }
    echo $text;
}
0 голосов
/ 16 марта 2017

Вы можете использовать пакет 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
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...