Вот мое предложение, надеюсь, немного яснее, чем принятый ответ.
function permutate($elements, $perm = array(), &$permArray = array())
{
if(empty($elements))
{
array_push($permArray,$perm); return;
}
for($i=0;$i<=count($elements)-1;$i++)
{
array_push($perm,$elements[$i]);
$tmp = $elements; array_splice($tmp,$i,1);
permutate($tmp,$perm,$permArray);
array_pop($perm);
}
return $permArray;
}
и использование:
$p = permutate(array('a','b','c'));
foreach($p as $perm)
print join(",",$perm)."|\n";