Le estoy entendiendo un poquito más. Me quedo con tarea.
Pero yo creo que voy a ver la alternativa del array para otro caso, ya que la alternativa que usé fué la de condicionar el Apellido. 
(Lo que pususte GatorV) 
 Código PHP:
        do {
          $Apellido = $row['apellido'];
          $Nombre = $row['nombre'];
          if ($Apellido != $lastApellido) {
                  echo "<h2>$Apellido</h2>";
                  $lastApellido = $Apellido;
          }
          echo <p>$Nombre</p>;
    } while (..); 
    
  que me funcionó bien. 
Solo que me salió una duda. 
En este caso se me genera un <h2> seguido de varios <p>
<h2>
<p>
<p> 
Pero necesito que se genere un div contenedor al rededor del grupo 
<div>
 <h2>
  <p>
  <p> 
</div> 
La etiqueta de apertura evidentemente no tiene problema, la meto en el primer echo  
 Código PHP:
    echo "<div><h2>$Apellido</h2>"; 
    
  Pero la de cierre siempre acabo con esto:  
<div>
  <h2>
  <p> 
</div>
  <p> 
</div> 
Pregunta, ¿cómo puedo cerrar el div una sola vez?  
 
Necesito seguir usando esta estructura do while conteniendo todo ya que adentro el script ya se volvió muy elaborado. Y ya me entendí solito 
