O teu código tá bom, não vejo o problema. Eu talvez fizesse ligeiramente diferente para poupar linhas, por exemplo:
- A variável $p_nome é um pouco desnecessária, podes usar $_nome[0] directamente na concatenação final.
- Usava o sizeof em vez do count, se bem que ambos fazem o mesmo.
- Não percebi porque usas o substr dessa forma se só queres o 1º char, podes fazer substr(string, 0, 1)
- Podes usar o end() para sacar o último elemento do array.
Ou seja, eu faria assim:
$nome = explode(' ', $qry['nome']);
$nome = $nome[0] . ' ' . substr(end($nome), 0, 1) . '.';