2012-02-21 23 views
9

Tôi đã viết một hàm đệ quy trong PHP để cắt văn bản. Văn bản được cắt sẽ có ... đính kèm vào cuối. Văn bản không cắt sẽ được trả lại ở trạng thái ban đầu.Giá trị trả về hàm đệ quy PHP

Nó hoạt động nếu văn bản phù hợp với chiều rộng tối đa. Tuy nhiên, nếu nó không phù hợp với chiều rộng đã cho thì hàm sẽ không trả về một giá trị nhưng nó nên. Dường như toàn bộ câu lệnh trả về bị bỏ qua. Nếu tôi thay thế trả về bằng echo, nó sẽ hiển thị giá trị chính xác.

Kết quả mong đợi:
-test ZIN
-test ZI
-test Z
-test
-TES
-TE ... (gì được trả lại ở đây vì vậy đây sẽ không bao giờ được hiển thị)

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

LƯU Ý: chức năng của echo là để gỡ lỗi.

Cảm ơn bạn trước.

+0

Bạn nên đặt những gì hằng số 'SIZE' bằng. Nó sẽ làm cho việc này chạy dễ dàng hơn một chút, vì vậy chúng tôi đang ở trong cùng một sân chơi bóng chày. – Tim

+0

Một chức năng để cắt văn bản? Bạn có thể giải thích thêm một chút về những gì bạn đang cố gắng thực hiện với chức năng này không? – tcables

+0

Bạn nói đúng. Xin lỗi vì điều đó. SIZE = 9 và FONTURL = '/usr/share/fonts/dejavu/DejaVuSans.ttf' –

Trả lời

19

Bạn không trả lại văn bản đúng cách, ví dụ:

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

Anywhere bạn làm đệ quy và cần phải trả lại một giá trị, bạn phải chụp/quay trở lại cuộc gọi đệ quy chính nó:

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

hoặc

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

Cảm ơn bạn. Điều này hoạt động tốt. Tôi chưa bao giờ thực hiện chức năng đệ quy 'thế giới thực', vì vậy điều này hoàn toàn mới đối với tôi. Giải pháp đầu tiên bạn đề xuất hoạt động như một sự quyến rũ. –

4

Return kết quả của hàm đệ quy của bạn call;)

return check_length(substr($str, 0, -1), $max, $size, true); 
Các vấn đề liên quan