Стандартная комбинаторная задача на перестановки, решается как рекурсивными, так и нерекурсивными алгоритмами, посмотреть можно, например,
здесь
Вот реализация одного из алгоритмов на php:
$arr = array('word1', 'word2', 'word3');
$n = count($arr);
for ($i = 1; $i <= $n; $i++) {
$pos[$i] = $i-1;
$c[$i] = 1;
$pr[$i] = 1;
}
$c[$n] = 0;
foreach($pos as $p)
echo $arr[$p],' ';
echo "<br>";
$i = 1;
while ($i < $n) {
$i = 1;
$x = 0;
while ($c[$i] == $n-$i+1) {
$pr[$i] = 1-$pr[$i];
$c[$i] = 1;
$x += $pr[$i];
$i++;
}
if ($i < $n) {
$k = $pr[$i] ? $c[$i]+$x : $n-$i+1-$c[$i]+$x;
$t = $pos[$k];
$pos[$k] = $pos[$k+1];
$pos[$k+1] = $t;
foreach($pos as $p)
echo $arr[$p],' ';
echo "<br>";
$c[$i]++;
}
}
Результат:
word1 word2 word3
word2 word1 word3
word2 word3 word1
word3 word2 word1
word3 word1 word2
word1 word3 word2