Intanto una cosa, se come indice degli array metti per tutti "gruppo" è come se in realtà ne mettessi solo uno, l'ultimo, perché come gli indici di un array PHP, non possono essercene 2 uguali, sopravvive solo l'ultimo dichiarato, gli altri vengono a turno sostituiti da quello che segue-
Quindi direi che andrebbe fatto così
Codice PHP:
$json '{
"file":[
   {
        "gruppo1": [
           {
            "ospite1": 
                {
                    "nome": "Mario",
                    "cognome": "Rossi" 
                }
             ,
            "ospite2": 
                {
                    "nome": "Paolo",
                    "cognome": "Verdi" 
                }
            ,    
            "ospite3":
                {
                    "nome": "Paolo",
                    "cognome": "Verdi" 
                }
          }
          ],
          
        "gruppo2": [
           {
            "ospite1": 
                {
                    "nome": "Mario",
                    "cognome": "Rossi" 
                }
             ,
            "ospite2": 
                {
                    "nome": "Paolo",
                    "cognome": "Verdi" 
                }
            ,    
            "ospite3":
                {
                    "nome": "Paolo",
                    "cognome": "Verdi" 
                }
          }
       ]
 }
]
}'
;

$json_o json_decode($json,true);

foreach( 
$json_o['file'] as $gruppi )
{
    foreach( 
$gruppi as $gruppo )
    {
        foreach( 
$gruppo as $ospiti )
        {
            foreach(
$ospiti as $ospite)
            {
                echo 
$ospite['nome'] . ' ' $ospite['cognome'] . '<br>';
            }
        }
    }