PHP递归函数返回值

9

我用 PHP 写了一个递归函数来截取文本。截取后的文本将以 ... 结尾。如果文本未被截取,则返回其原始状态。

如果文本超出最大宽度,函数将不返回值,但它应该返回值。似乎整个 return 语句被忽略了。如果我将 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);

注意:函数中的回显是为了调试。


你应该把常量'SIZE'等于什么放进去。这样运行会更容易,我们就在同一个范围内了。 - Tango Bravo
一个裁剪文本的函数?你能详细解释一下你想用这个函数实现什么吗? - tcables
你是对的。对此很抱歉。SIZE = 9 和 FONTURL = '/usr/share/fonts/dejavu/DejaVuSans.ttf'。 - user1029650
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;

1
谢谢。这个很好用。我以前从未做过“真实世界”的递归函数,所以这对我来说都是新的。你建议的第一个解决方案非常好。 - user1029650

3

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接