2013-05-24 2 views
0

Я создаю приложение, которое позволяет пользователям писать на изображении с использованием изображения GD. Ящик изображения имеет определенную ширину. Я сталкиваюсь с проблемой, когда пользователи пишут слова, длина которых больше ширины моего изображения. Я хотел использовать рекурсию, чтобы разделить слово, полагаю, что я не профессионал в этом. Вот что у меня есть.Рекурсия для разбиения слова по определенной ширине линии (gd-образ)

function cutLongWord($word, $fullwidth, $font, $fontsize){ 

    $arrWords = array(); 

    splitWord($arrWords, $word, $fullwidth, 0, $font, $fontsize); 
} 

function splitWord(&$arrWords, $word, $fullwidth, $startIndex, $font, $fontsize){ 
$output = ""; 
$numStringLength = strlen($word); 

for($i = 1; ($i + $startIndex) <= $numStringLength; $i++){ 
    $substring = substr($word, $startIndex, $i); 
    //dimension of substring 
    $dimensions = imagettfbbox($fontsize, 0, $font, $substring); 
    //line width of substring 
    $subLineWidth = $dimensions[4] - $dimensions[0]; 


    if($subLineWidth <= $fullwidth){ 
     $output = $substring; 
    } 
    else { 

     $arrWords[] = splitWord($arrWords, $word, $fullwidth, ($i - 1), $font, $fontsize); 

    } 
} 

return $output; 
} 

Этот объект проходит в бесконечном цикле. Я как бы застрял. Если бы вы могли указать мне в правильном направлении, я был бы очень благодарен.

Спасибо.

+0

посмотреть на [WordWrap] (http://php.net/manual/en/function.wordwrap.php) или [chunk_split] (HTTP://www.php.net/manual/en/function.chunk-split.php). это было бы намного проще. – bitWorking

+0

также смотрите на комментарии [здесь] (http://de3.php.net/manual/en/function.imagettfbbox.php). они полны таких функций. – bitWorking

+0

Я думаю, что ваш бесконечный цикл здесь: $ arrWords [] = splitWord (& $ arrWords, $ word, $ fullwidth, ($ i - 1), $ font, $ fontsize); Если слово не поместится в строке, то вы снова разделите все слово, но снова слово не подходит и так далее. – tingel2k

ответ

0

Вам, вероятно, не нужно использовать рекурсию для этого, так как это чрезмерно усложняет ситуацию. Вы могли бы сделать то же самое, как это:

while(strlen($word) < width) 
{ 
    // Split a section of text of width "width" 
    // and add it to array. 
} 
+0

Я перепрограммировал его с помощью цикла while, и теперь он работает. Я просто подумал, что когда-нибудь мне понадобится рекурсия, поскольку это похоже на мощный инструмент. – acriel

+0

В этом случае, я думаю, проблема может заключаться в том, что у вас есть цикл for и рекурсия. Попробуйте что-нибудь в этих строках: 'function splitword (...) {if ($ word> = $ fullwidth) {$ arrWords = splitword (...)} return $ arrWords}' Рекурсия делает намного больше смысла, как только вы получаете голову вокруг него. –

Смежные вопросы