Crear permutación de no repetición de longitud fija de conjunto más grande

Sé que este tema se discute mucho pero parece que no puedo encontrar ninguna implementación que se ajuste a mis necesidades.

Tengo el siguiente conjunto de caracteres:

a b c d e f g h

Quiero obtener todas las permutaciones o combinaciones posibles (no repetidas),pero en un conjunto limitado (variable) de caracteres, es decir, si ingreso los caracteres y el número2, los resultados deben verse como

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 entiendas a dónde voy con esto. Actualmente tengo una implementación que me da las permutaciones detodos personajes, pero no puedo entender cómo implementar unespacio limitado para esas permutaciones:

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;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta