2012-02-21 4 views
9

텍스트를 자르기 위해 PHP에서 재귀 함수를 작성했습니다. 자른 텍스트는 ... 끝에 붙습니다. 자르지 않은 텍스트는 원래 상태로 반환됩니다.PHP 재귀 함수 반환 값

텍스트가 최대 너비에 맞는 경우 작동합니다. 그러나 주어진 너비에 맞지 않으면 함수는 값을 반환하지 않지만 반드시 반환해야합니다. 전체 return 문이 무시 된 것 같습니다. 반향을 반향으로 바꾼다면 정확한 값을 보여줍니다.

예상 결과 :
- TEST ZIN
- TEST ZI
- TEST Z
- TEST
-TES
-TE (아무것도 그래서 여기에 반환되지 않습니다이 표시되지 않습니다)

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); 

참고 :이 기능의 에코는 디버깅 용입니다.

미리 감사드립니다.

+0

상수 'SIZE'는 다음과 같습니다. 이 작업을 조금 더 쉽게 수행 할 수 있으므로 동일한 구장에 있습니다. – Tim

+0

텍스트자를 수있는 기능은 무엇입니까? 이 기능을 사용하여 수행하려는 작업을 조금 더 설명해 주시겠습니까? – tcables

+0

당신 말이 맞아요. 미안합니다. SIZE = 9 및 FONTURL = '/usr/share/fonts/dejavu/DejaVuSans.ttf' –

답변

19

예를 들어 텍스트를 올바르게 반환하지 않았습니다.

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

외부에서 당신은 재귀를하고 값을 반환해야합니다, 당신은 재귀 호출 자체를 반환/캡처해야합니다 :

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

또는

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

감사합니다. 이것은 잘 작동합니다. 나는 '실세계 (real world)'재귀 함수를 한 번도 해 본 적이 없기 때문에 이것은 새로운 것이다. 당신이 제안한 첫 번째 해결책은 매력처럼 작동합니다. –

4

반환하여 재귀 함수의 결과를 전화 번호)

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