php求数组全排列,元素所有组合的方法

    1. <?php
    2. $source = array('pll','我','爱','你','嘿');
    3. sort($source); //保证初始数组是有序的
    4. $last = count($source) - 1; //$source尾部元素下标
    5. $x = $last;
    6. $count = 1; //组合个数统计
    7. echo implode(',', $source), "<br>"; //输出第一种组合
    8. while (true) {
    9. $y = $x--; //相邻的两个元素
    10. if ($source[$x] < $source[$y]) { //如果前一个元素的值小于后一个元素的值
    11. $z = $last;
    12. while ($source[$x] > $source[$z]) { //从尾部开始,找到第一个大于 $x 元素的值
    13. $z--;
    14. }
    15. /* 交换 $x 和 $z 元素的值 */
    16. list($source[$x], $source[$z]) = array($source[$z], $source[$x]);
    17. /* 将 $y 之后的元素全部逆向排列 */
    18. for ($i = $last; $i > $y; $i--, $y++) {
    19. list($source[$i], $source[$y]) = array($source[$y], $source[$i]);
    20. }
    21. echo implode(',', $source), "<br>"; //输出组合
    22. $x = $last;
    23. $count++;
    24. }
    25. if ($x == 0) { //全部组合完毕
    26. break;
    27. }
    28. }
    29. echo 'Total: ', $count, "\n";
    30. ?>
    1. <?php
    2. $source= array(1,2,3,4);
    3. echo '1234的全排列为<br/>';
    4. sort($source); //保证初始数组是有序的
    5. $last = count($source) - 1; //$source尾部元素下标
    6. $x = $last;
    7. $count = 1; //组合个数统计
    8. echo implode('', $source), ","; //输出第一种组合
    9. while (true) {
    10. $y = $x--; //相邻的两个元素
    11. if ($source[$x] < $source[$y]) { //如果前一个元素的值小于后一个元素的值
    12. $z = $last;
    13. while ($source[$x] > $source[$z]) { //从尾部开始,找到第一个大于 $x 元素的值
    14. $z--;
    15. }
    16. /* 交换 $x 和 $z 元素的值 */
    17. list($source[$x], $source[$z]) = array($source[$z], $source[$x]);
    18. /* 将 $y 之后的元素全部逆向排列 */
    19. for ($i = $last; $i > $y; $i--, $y++) {
    20. list($source[$i], $source[$y]) = array($source[$y], $source[$i]);
    21. }
    22. echo implode('', $source), ","; //输出组合
    23. $x = $last;
    24. $count++;
    25. }
    26. if ($x == 0) { //全部组合完毕
    27. break;
    28. }
    29. }
    30. ?>