Cambio mayúsculas/minúsculas con caracteres acentuados

En PHP existen funciuones específicas para estas operaciones, strtoupper() y strtolower(), pero no son funcionales al 100% (al menos en castellano) por el tema de los caracteres acentuados, que no los convierten.

Combinando el uso de las mencionadas funciones con strstr() para sustituciones en los caracteres conflictivos tenemos:

<?php
echo strtr(strtoupper("hola tío"), "àáâãäåæçèéêëìíîïðñòóôõöøùüú", "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÜÚ"); # HOLA TÍO
echo strtr(strtolower("HOLA TÍO"), "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÜÚ", "àáâãäåæçèéêëìíîïðñòóôõöøùüú"); # hola tío
?>