2012-02-21 3 views
9

Я написал рекурсивную функцию в PHP для обрезки текста. Обрезанный текст будет ... прикреплен к концу. Необработанный текст будет возвращен в исходном состоянии.Возвращаемое значение рекурсивной функции PHP

Он работает, если текст соответствует максимальной ширине. Однако, если он не соответствует заданной ширине, функция не вернет значение, но должно. Кажется, что весь оператор возврата игнорируется. Если я заменил возврат эхом, он отобразит правильное значение.

Ожидаемый результат:
-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

Спасибо. Это прекрасно работает. Я никогда не выполнял рекурсивную функцию «реального мира», поэтому для меня это все новое. Первое предложенное вами решение работает как шарм. –

4

возвращает результат вашей рекурсивной функции звонок;)

return check_length(substr($str, 0, -1), $max, $size, true); 
Смежные вопросы