2012-02-21 20 views
9

He escrito una función recursiva en PHP para recortar texto. El texto recortado tendrá ... adjunto al final. El texto no recortado se devolverá en su estado original.Función recursiva PHP valor devuelto

Funciona si el texto se ajusta al ancho máximo. Sin embargo, si no cabe en el ancho dado, la función no devolverá un valor, pero debería. Parece que se ignora toda la declaración de devolución. Si reemplazo el retorno con eco, muestra el valor correcto.

El resultado esperado:
-TEST ZIN
-TEST ZI
-TEST Z
-TEST
-TES
-TE ... (no se devuelve nada aquí, así que esto nunca se mostrará)

function check_length($str, $max, $size = SIZE, $rec = false) { 
    echo "FUNCTION $str "; 
    list($left, , $right) = imageftbbox($size, 0, FONTURL, $str); 
    if($rec == false) { 
     if(($right - $left) > $max) { 
      echo 'if 1<br />'; 
      check_length(substr($str, 0, -1), $max, $size, true); 
     } else { 
      echo 'else 1<br />'; 
      return $str; 
     } 
    } else { 
     if(($right - $left) > ($max - 9)) { 
      echo 'if 2<br />'; 
      check_length(substr($str, 0, -1), $max, $size, true); 
     } else { 
      echo 'else 2<br />'; 
      return "$str..."; 
     } 
    } 
} 

echo check_length('TEST ZIN', 30); 

NOTA: los ecos en la función son para la depuración.

Gracias de antemano.

+0

Deberías poner lo la constante 'SIZE' es igual a. Hará que correr esto sea un poco más fácil, así que estamos en el mismo estadio. – Tim

+0

¿Una función para recortar texto? ¿Podría explicar un poco más lo que está tratando de lograr con esta función? – tcables

+0

Tienes razón. Lo siento por eso. SIZE = 9 y FONTURL = '/usr/share/fonts/dejavu/DejaVuSans.ttf' –

Respuesta

19

No devuelve el texto correctamente, p.

} else { 
     echo 'else 1<br />'; 
     return $str; <---nothing in the 'parent' caller catches this, so it's lost 
    } 

En cualquier lugar donde hacer la recursividad y la necesidad de devolver un valor, debe capturar/devolver la llamada recursiva en sí:

return check_length(substr($str, 0, -1), $max, $size, true); 

o

$newstr = check_length(...); 
    return $newstr; 
+1

Gracias. Esto funciona bien Nunca he hecho la función recursiva del "mundo real", así que todo esto es nuevo para mí. La primera solución que sugeriste funciona como un encanto. –

4

devolver el resultado de la función recursiva llamar;)

return check_length(substr($str, 0, -1), $max, $size, true); 
Cuestiones relacionadas