2012-02-21 21 views
9

Ho scritto una funzione ricorsiva in PHP per ritagliare il testo. Il testo ritagliato avrà ... allegato alla fine. Il testo non ritagliato verrà restituito nel suo stato originale.Funzione ricorsiva PHP valore restituito

Funziona se il testo si adatta alla larghezza massima. Tuttavia, se non si adatta alla larghezza specificata, la funzione non restituirà un valore ma dovrebbe. Sembra che l'intera dichiarazione di ritorno sia ignorata. Se sostituisco il ritorno con echo, mostra il valore corretto.

Il risultato atteso:
-TEST ZIN
-TEST ZI
-TEST Z
-TEST
-TES
-TE ... (nulla viene restituito qui quindi questo non sarà mai mostrato)

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: gli echi nella funzione sono per il debug.

Grazie in anticipo.

+0

Si dovrebbe mettere cosa la costante 'SIZE' è uguale a. Farà funzionare questo un po 'più facile, quindi siamo nello stesso campo da baseball. – Tim

+0

Una funzione per ritagliare il testo? Potresti spiegare un po 'di più cosa stai cercando di ottenere con questa funzione? – tcables

+0

Hai ragione. Mi dispiace per quello SIZE = 9 e FONTURL = '/usr/share/fonts/dejavu/DejaVuSans.ttf' –

risposta

19

Non stai restituendo il testo correttamente, ad es.

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

Ovunque si fanno la ricorsione e la necessità di restituire un valore, è necessario acquisire/restituire la chiamata ricorsiva sé:

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

o

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

Grazie. Funziona bene Non ho mai fatto la funzione ricorsiva del "mondo reale", quindi questo è tutto nuovo per me. La prima soluzione che hai suggerito funziona come un fascino. –

4

ritorno il risultato della vostra funzione ricorsiva call;)

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