有关php数组全排列的递归算法的代码,参见文章:php全排列的递归算法的代码 。
以下是php数组全排例的非递归算法实现代码:
<?php
/**
* 取得数组的全排列
*
* @param array $source 待排列数组,一维
* @return array
* @site www.jb200.com
*/
function getAllPerm($source)
{
$rs = array();
sort($source);
$last = count($source) - 1;
$z = 0;
$x = $last;
$rs[] = $source;
while($x > 0)
{
// 相邻的两个元素,先将x的值赋给y,x再自减1
$y = $x--;
// 如果前一个元素的值小于后一个元素的值
if($source[$x] < $source[$y])
{
// 从尾部开始,找到第一个大于 $x 元素的值
$z = $last;
while($source[$x] > $source[$z])
{
$z--;
}
// 交换 $x 和 $z 元素的值
list($source[$x], $source[$z]) = array($source[$z], $source[$x]);
// 将 $y 之后的元素全部逆向排列
for($i = $last; $i > $y; $i--, $y++)
{
list($source[$i], $source[$y]) = array($source[$y], $source[$i]);
}
$rs[] = $source;
$x = $last;
}
}
return $rs;
}
$source = array(1,2,3);
$rs = getAllPerm($source);
print_r($rs);
?>
输出结果:
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[1] => Array
(
[0] => 1
[1] => 3
[2] => 2
)
[2] => Array
(
[0] => 2
[1] => 1
[2] => 3
)
[3] => Array
(
[0] => 2
[1] => 3
[2] => 1
)
[4] => Array
(
[0] => 3
[1] => 1
[2] => 2
)
[5] => Array
(
[0] => 3
[1] => 2
[2] => 1
)
)