Не знаю, как объяснить. Но, возможно, пример ниже позволит вам понять, в чем моя проблема.
Пример :
У меня есть массив с 3 элементами.
$elements = array( 'A', 'B', 'C' );
Перестановка будет 3 в 3. Таким образом, результат:
ABC ; ACB ; BAC ; BCA ; CAB; CBA
Я не хочу перестановки 2 в 3 или 1 в 3, всего 3 в 3, как вы можете видеть в примере. Поэтому, если у меня есть 4 элемента в массиве, перестановка 4 в 4. и так далее …
(Я думаю, что число перестановок равно 3! = 1 * 2 * 3 = 6 перестановок, 4! = 1 * 2 * 3 * 4 = 24 перестановки … вот почему я называю перестановки факториала.)
Если есть другие вопросы и ответы, похожие на мою проблему, пожалуйста, дайте мне знать
Используйте рекурсивную функцию:
function permutations($elements) { if(count($elements)<2) return $elements; $newperms= array(); foreach($elements as $key=>$element) { $newelements= $elements; unset($newelements[$key]); $perms= permutations($newelements); foreach($perms as $perm) { $newperms[]= $element."-".$perm; } } return $newperms; }
неfunction permutations($elements) { if(count($elements)<2) return $elements; $newperms= array(); foreach($elements as $key=>$element) { $newelements= $elements; unset($newelements[$key]); $perms= permutations($newelements); foreach($perms as $perm) { $newperms[]= $element."-".$perm; } } return $newperms; }
Не тестировал, так что для вас все еще есть работа 😉
Не уверен, что вам нужно, но пытаетесь ли вы произвести эти перестановки?
Это должно заставить вас начать, он выполнит полную перестановку на любом требуемом вами размере. Добавлены некоторые аннотации, вы должны иметь возможность получить идею
$array = array('A','B','C', 'D'); $permutations = array($array); $perm_pool = range(0, count($array)-1); function getPermutation($p, $size){ // we pass in an array of integers, basically pointers, we want to see when we've fully reversed the set for ($i = $size-1; $p[$i] >= $p[$i+1]; $i--){} // the array starts at [1,2,3,4], when we've reached [4,3,2,1], we're done. if ($i == -1) { return false; } // slide down to the next largest number, this will be our next swap for ($j = $size; $p[$j] <= $p[$i]; $j--) {} // swap it $tmp = $p[$i]; $p[$i] = $p[$j]; $p[$j] = $tmp; // reverse the arrangement by swapping the head and tails for ($i++, $j = $size; $i < $j; $i++, $j--){ $tmp = $p[$i]; $p[$i] = $p[$j]; $p[$j] = $tmp; } return $p; } $i=1; while($perm_pool=getPermutation($perm_pool, count($array)-1)){ foreach($perm_pool as $p){ $permutations[$i][] = $array[$p]; } $i++; }