<?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);
}
}
}
}