Criar permutação não repetitiva de comprimento fixo de um conjunto maior

Eu sei que este tópico é muito discutido, mas não consigo encontrar nenhuma implementação que atenda às minhas necessidades.

Eu tenho o seguinte conjunto de caracteres:

a b c e f g h

Eu quero obter todas as permutações possíveis ou combinações (não repetindo),mas em um conjunto limitado de caracteres, ou seja, se eu introduzir os caracteres e o número2, os resultados devem parecer

ab ba ac ca ad da ae ea af fa ag ga ah ha
bc cb bd db be eb bf fb bg gb bh hb
cd dc ce ec cf fc cg gc ch hc
de ed df fd dg gd dh hd
ef fe eg ge eh he
fg gf fh hf
gh hg

Espero que você entenda onde estou indo com isso. Atualmente tenho uma implementação que me dá as permutações detodos personagens, mas eu não posso envolver minha cabeça em torno de como implementar umespaço limitado para essas permutações:

public function getPermutations($letters) {
    if (strlen($letters) < 2) {
        return array($letters);
    }

    $permutations = array();
    $tail = substr($letters, 1);

    foreach ($this->getPermutations($tail) as $permutation) {
        $length = strlen($permutation);

        for ($i = 0; $i <= $length; $i++) {
            $permutations[] = substr($permutation, 0, $i) . $letters[0] . substr($permutation, $i);
        }
    }

    return $permutations;
}

questionAnswers(2)

yourAnswerToTheQuestion