10

我在 PHP 中编写了一个递归函数来裁剪文本。裁剪后的文本将带有 ... 附加到末尾。未裁剪的文本将以其原始状态返回。

如果文本适合最大宽度,它会起作用。但是,如果它不适合给定的宽度,则函数将不会返回值,但应该返回。似乎整个 return 语句都被忽略了。如果我用 echo 替换返回,它会显示正确的值。

预期结果:
-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);

注意:函数中的 echo 用于调试。

先感谢您。

4

2 回答 2

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;
于 2012-02-21T15:47:15.103 回答
3

返回递归函数调用的结果;)

return check_length(substr($str, 0, -1), $max, $size, true);
于 2012-02-21T15:47:36.483 回答