$tatil_gunleri = array('15.07.2021','30.08.2021');
$baslangic = '13.07.2021';
$toplam = 15;
$_baslangic = strtotime($baslangic.' 00:00:01');
$_artik_gunler = array();
$_izinli_gunler = array();
foreach(range(1,$toplam) as $day){
    $gun = $day*86400;
    $bugun = $_baslangic+$gun;
    $haftanin_gunu = date('w',$bugun);
    if(in_array($tatil_gunleri,date('d.m.Y',$bugun))!==false || $haftanin_gunu==5 || $haftanin_gunu==6){
        $_artik_gunler[] = date('d.m.Y',$bugun);
    }else{
        $_izinli_gunler[] = date('d.m.Y',$bugun);
    }
}

if(!empty($_artik_gunler)){
    $kalan = count($_artik_gunler);
    $_izinli_son_gun = end($_izinli_gunler);
    foreach(range(1,$kalan) as $day){
        $gun = $day*86400;
        $bugun = $_izinli_son_gun+$gun;
        $haftanin_gunu = date('w',$bugun);
        if(in_array($tatil_gunleri,date('d.m.Y',$bugun))!==false || $haftanin_gunu==5 || $haftanin_gunu==6){
            $_artik_gunler[] = date('d.m.Y',$bugun);
        }else{
            $_izinli_gunler[] = date('d.m.Y',$bugun);
        }
    }
}
gibi birşeyle halledilebilir
basitce yazdim ama artik gunleri tekrar tatile gelmemesi için döngüye sokmak gerekir