Все возможные варианты из двумерного массива

vitalekmail

Создатель
Регистрация
10 Авг 2015
Сообщения
18
Реакции
1
Нужно из двумерного массива собрать все возможные комбинации.
Массив создается из формы textarea, в которую забиваются по несколько слов в каждую строчку. Естественно сколько будет строк и слов в строке программисту никто не говорит =)

Всё омрачняется тем что нужно брать максимум одно слово из строки минимум ноль.

Как это можно сделать? Буду рад если увижу алгоритм.
 
"нужно брать максимум одно слово из строки минимум ноль." - т.е. просто одно слово брать?
 
всмысле нужно перебрать все строки и взять из каждой... короче...

1 2 3
4 5 6
7 8 9

должны быть варианты вроде 1, 1 4, 1 7, 1 4 7, ... и др. 1 4 8, 1 5 7, 2 4 7, 3 4 7, 2, 5, 9 порядок конечно другой будет, но эти выборки слов должны попасть.
 
Нужно из двумерного массива собрать все возможные комбинации.
Массив создается из формы textarea, в которую забиваются по несколько слов в каждую строчку. Естественно сколько будет строк и слов в строке программисту никто не говорит =)

Всё омрачняется тем что нужно брать максимум одно слово из строки минимум ноль.

PHP:
//$post — это что нам прилетает из textarea
$post = "
У любой организации (семьи, школы, корпорации, муниципалитета, правительства страны)
возникает естественная необходимость что-то контролировать или запрещать.
Цели могут быть  самыми разными —  от ангельских до дьявольских.
Нас интересуют способы, с помощью которых можно воплощать в жизнь тот или иной запрет,
не вызывая раздражения у тех, кого контролируют или ограничивают.
";

//массив первого уровня
$arr1 = explode("\n",trim($post));
//искомый массив
$arr2 = array();
foreach ($arr1 as $key => $value) {
//делим по пробелу
$tmp = explode(" ",trim($value));
$arr2[$key] =  $tmp[0];
}
var_dump($arr2);
array(5) {
[0]=>
string(2) "У"
[1]=>
string(18) "возникает"
[2]=>
string(8) "Цели"
[3]=>
string(6) "Нас"
[4]=>
string(4) "не"
}
 
Последнее редактирование:
Это к чему?

Сделал так
Код:
<?php

/**
* Class Variations
* Класс для генерации всевозможных комбинаций из массива
*/
class Variations
{
    /**
     * Все возможные комбинации из двумерного массива
     * @param $array
     * @param bool $allstring - если задать true комбинация будет включать все строки, иначе будут использоваться различные варианты, включающие так же одиночные елементы массива
     */
    function all($array, $allstring = false)
    {
        //колличество удаляемых строк
        for ($p = sizeof($array) - 1; $p >= 0; $p--) {
            //если при вызове задан второй параметр выходим из цикла
            if($allstring){
                $p = 0;
            }
            //первая удаляемая строка
            for ($firstkey1 = sizeof($array); $firstkey1 < sizeof($array) * 2; $firstkey1++) {
                //смещаю первую строку колличество удаляемых строк
                $firstkey = $firstkey1 - $p;
                //если строк для удаления нет выхожу из цикла
                if ($p == 0) {
                    $firstkey1 = sizeof($array) * 2;
                }
//если значение $firstkey выходит за границы первоначального размера массива, поправляю его
                if ($firstkey >= count($array)) {
                    $firstkey = $firstkey - count($array);
                }
//устанавливаю/сбрасываю колличество комбинаций
                $combinations = 1;
                $array2 = array();//создаю или обнуляю массив
                $array2 = $array;//наполняю новый массив
//цикл для удаления строк
                for ($key = $firstkey; $key < $p + $firstkey; $key++) {
                    $key1 = $key;
                    //если $key1 выходит за границы массива, правлю его
                    if ($key1 >= count($array)) {
                        $key1 = $key1 - count($array);
                    }
                    unset($array2[$key1]);
                }

                $array2 = array_values($array2);//переиндексируем массив

                for ($i = 0; $i < sizeof($array2); $i++) {
                    $combinations *= sizeof($array2[$i]);
                    $currentKeys[$i] = 0;
                }
// Вычисляет последний разряд (последний барабан, который
// будет крутиться) при прохождении 1-го километра трассы
                $n = sizeof($array2) - 1;

// Цикл, делаем его столько, сколько есть возможных
// комбинаций
                for ($i = 0; $i < $combinations; $i++) {
                    $string = null;
                    // Записываем одно слово и перемещаемся по вертикали вниз
                    for ($k = 0; $k < sizeof($array2); $k++) {
                        $string .= $array2[$k][$currentKeys[$k]] . " "; //[$currentKeys[$k] - текущее положение по горизонтали
                    }
                    $arrayword2 = array();
                    $arrayword2 = explode(" ", $string);
                    array_pop($arrayword2);
                    $this->pc_permute($arrayword2) . "<br>";
                    unset($arrayword2);

                    $currentKeys[$n]++;

                    for ($k = sizeof($array2) - 1; $k >= 0; $k--) {
                        if ($currentKeys[$k] >= sizeof($array2[$k])) {
//                            echo "<br>";
                            $currentKeys[$k] = 0;
                            if ($k - 1 >= 0) {
                                $currentKeys[$k - 1]++;

                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * Все возможные комбинации из одномерного массива
     * @param $items
     * @param array $perms
     */
    function pc_permute($items, $perms = array( )) {
        if (empty($items)) {
            print join(' ', $perms) . " | ";
        } else {
            for ($i = count($items) - 1; $i >= 0; --$i) {
                $newitems = $items;
                $newperms = $perms;
                list($foo) = array_splice($newitems, $i, 1);
                array_unshift($newperms, $foo);
                $this->pc_permute($newitems, $newperms);
            }
        }
    }
}
 
Назад
Сверху