Armazene tudo no banco de dados.
Você quer ter uma tabela "Task Template" e uma tabela "Task" onde haja um relacionamento um->muitos.
Quando o usuário indicar que deseja que uma tarefa ocorra novamente, crie um registro "Modelo de tarefa" e, em seguida, crie quantas "tarefas" o usuário indicou (não permita que um usuário crie tarefas muito no futuro). Cada tarefa é vinculada ao modelo de tarefa por meio de uma chave estrangeira. A ideia é que o SQL seja mais eficiente no gerenciamento desses registros do que tentar fazer tudo isso em código com base em um modelo. Dessa forma, você terá mais opções na hora de classificar e filtrar seus dados. Afinal, escrever uma consulta SQL é mais fácil do que escrever, testar e manter uma função PHP que manipula os dados.
Algumas outras dicas que eu te daria são:
- Tente obter muitas informações em seu registro "Modelo de tarefa". Mantenha o número de tarefas que o modelo cobre, a data em que a última tarefa termina, o tempo decorrido entre a primeira e a última tarefa, etc. Esses "Meta Data" podem ajudar a economizar tempo de consulta quando você estiver procurando classificar e filtrar tarefas.
- Coloque um índice no campo Data e FK, isso também ajudará no tempo de consulta.
- Acabei de criar dois aplicativos de calendário no trabalho que foram muito bem recebidos pelos chefes. Eu usei o plugin JQuery "FullCalendar" (http://arshaw.com/fullcalendar/). Eu usei o JQuery AJAX para lidar com a maioria dos meus eventos, e ele tinha suporte integrado para visualização de mês, dia e semana.