Hola,
 
Bueno, para 2 es relativamente sencillo. Solo tienes que coger los elementos de 1 a n-1, y emparejarlo con los elemento de i+1 a n, siendo n el numero total de elementos, e i el elemento en curso. 
Como estamos en PHP, aqui va el codigo en dicho lenguaje: 
 Código PHP:
    $a=array('a','b','c','d');
$n=count($a);
for($i=0;$i<($n-1);$i++) {
  for($j=($i+1);$j<$n;$j++) {
    echo $a[$i].' - '.$a[$j].'<br>';
  }
} 
    
  si no tengo oxidado el cerebro. 
Para 3 supongo que sera añadir un nivel mas de anidamiento. 
Por supuesto, ya habra un algoritmo generico para r elementos. Intenta buscar 'algoritmo combinatoria' o 'metodos numericos combinatoria' en google. 
Saludos. 
PD: Si no lo querias en PHP, lo dices y muevo el mensaje al foro de programacion.