ilk başta akla bunu sql ile çözmek geliyor. wp_posts'ları birbirine join edip if ve substr ile title'ın bi kısmı çekilip kontrol edilebilir.

kaç satırdan bahsediyoruz ? eğer çok değilse bunun sonuçlarını döndürdüğünüz yerde bir kontrol yapabilirsiniz. bir performans analizi yapın işinizi görüyorsa devam edersiniz değilse sorgu düzenlenebilir.

$sorgu = mysql_query("SELECT post_title FROM wp_posts WHERE post_title LIKE '".mysql_real_escape_string($harf)."%'");
$oncekisifir ="";
while($sorgusonuc=mysql_fetch_assoc($sorgu)) {
// şeklinde döndürüyorsunuz muhtemelen. ve explode ile bölüp son kısmı aldığınızı söylüyorsunuz. sanıyorum - gibi bi karakterden bölüyorsunuz. eğer ilk SANATÇI ADI - ŞARKI şeklinde ise şarkı için explodedangelen[1] 'i alıyorsunuzdur. o zaman explodedangelen[0] ile bir önceki kaydı kontrol edebilirsiniz. şöyle ki;
$parcala = explode($sorgusonuc['post_title'],"-");

if($parcala[0] != $oncekisifir) {
// farklı bir sanatçı gelmiş. burada işleminizi yapabilirsiniz.
}

$oncekisifir = $parcala[0];
} //while'ın kapanışı.

bu mantıkla bir ilerleyin. dediğim gibi performansa göre şekillenir de algoritmanız.

edit : mysql_real_escape_string($harf) sql injection
edit2: $oncekisifir while dışında başlatılmalı