Mhh... qué raro, trabajé siempre con funciones y nunca tuve problemas con eso.
¿Estas poniendo la función fuera de todo while o if? para mayor seguridad pone la función al comienzo de la pagina, después del <?php al menos que tengas un session_start() por supuesto, iría después de éste, ja.
Código PHP:
<?php
function url2amigable($entrada){
$ok = strtolower(strtr($entrada, "áéíóúñÁÉÍÓÚÑ", "aeiounaeioun"));
$find = array(' ', '&', '\r\n', '\n', '+');
$ok = str_replace ($find, '-', $ok);
$ok=str_replace("-de-", "-", $ok);
$ok=str_replace("-del-", "-", $ok);
$ok=str_replace("-en-", "-", $ok);
$ok=str_replace("-l-", "-", $ok);
$ok=str_replace("-y-", "-", $ok);
$ok=str_replace("-/-", "-", $ok);
$ok=str_replace("/.", ".", $ok);
$ok=str_replace("--","-",$ok);
return $ok;
}
$i = 0;
$total_subcat = intval(mysql_num_rows($subcategorias) / 3);
while($row = mysql_fetch_row($subcategorias)){
if(mysql_num_rows($subcategorias) > 2){
if($i==0)echo "<td width=240 valign=\"top\">";
echo "<a href=\"/$row[2]/".url2amigable($row[0]).".html \" class=\"cat\">$row[0]</a><SPAN class=\"cat-no\"> ($row[1])</span><br><br>";
if($i == $total_subcat ){echo "</td>";$i = -1;}
}else{
echo "<td width=240 valign=\"top\">";
echo "<a href=\"/$row[2]/".url2amigable($row[0]).".html \" class=\"cat\">$row[0]</a><SPAN class=\"cat-no\"> ($row[1])</span>";
if($i == 2){echo "</tr>";$i = -1;}
}
$i++;
}
?>
Supongo que con esto debería funcionar, y si no... me deja perplejo. Otra cosa, generalmente lo que yo hago para transformar el texto en url amigable, si es que en el texto puedan aparecer signos raros aparte de ñ o acentos, como: " ? !%# y cosas así, para hacerla más corta, ya que la lista de signitos es interminable para reemplazarlos uno por uno, solo extraigo lo que sean palabras y números.
Mi función url2amigable() seria así:
Código PHP:
function url2amigable($entrada){
$sinegne=strtr($entrada,"áéíóúñÁÉÍÓÚÑ", "aeiounaeioun");
preg_match_all("/([a-z0-9]+)/i", $sinegne, $coincidencias, PREG_SET_ORDER);
$theWord="";
foreach ($coincidencias as $val) {
$theWord.=$val[1]."-";
}//end foreach
$theWord=preg_replace("/[\-]+/","-",$theWord);
$theWords=preg_replace("/-$/","",$theWord);
return $theWords;
}