Hola,
He hecho una herramienta con una micro base de datos hecha en un simple array con las fechas festivas y otro con los días de la semana que debe saltar (0 y 6; domingo y sábado). Es una simple idea para que tengas en cuenta como poder desarrollarlo, es muy simple, he comentado las lineas para que puedas entender las variables de configuración y un poco el proceso pero si no te queda claro, o tienes alguna duda, no dudes en consultar!!
Código PHP:
<?php
date_default_timezone_set("Europe/Madrid");
// Guardamos en una variable los dias festivos en varios arrays con formato
// $dias_festivos[año][mes] = [dias festivos];
$dias_festivos = array(
"2015"=>array(12 => [3,4,5,25,31]),
"2016"=>array(1 => [1,6])
);
$dias_saltados = array(0,6); // 0: domingo, 1: lunes... 6:sabado
// dias a sumar
$dias = $dias_origin = 10;
// dias que el programa ha contado
$dias_contados = 0;
// timestamp actual
$time = time();
// duracion (en segundos) que tiene un día
$dia_time = 3600*24; //3600 segundos en una hora * 24 horas que tiene un dia.
function esFestivo($time) {
global $dias_saltados;
global $dias_festivos;
$w = date("w",$time); // dia de la semana en formato 0-6
if(in_array($w, $dias_saltados)) return true;
$j = date("j",$time); // dia en formato 1 - 31
$n = date("n",$time); // mes en formato 1 - 12
$y = date("Y",$time); // año en formato XXXX
if(isset($dias_festivos[$y]) && isset($dias_festivos[$y][$n]) && in_array($j,$dias_festivos[$y][$n])) return true;
return false;
}
while($dias != 0) {
$dias_contados++;
$tiempoContado = $time+($dia_time*$dias_contados); // Sacamos el timestamp en la que estamos ahora mismo comprobando
if(esFestivo($tiempoContado) == false)
$dias--;
}
echo "El programa ha recorrido ".$dias_contados." (ha saltado ".($dias_contados-$dias_origin).") hasta llegar la fecha que deseabas:".PHP_EOL
.date("D, d/m/Y",$tiempoContado);
echo PHP_EOL;
?>
Un saludo!