10

PHPで、テキストをトリミングする再帰関数を作成しました。トリミングされたテキストの最後には...が付加されます。トリミングされていないテキストは、元の状態で返されます。

テキストが最大幅に収まる場合に機能します。ただし、指定された幅に収まらない場合、関数は値を返しませんが、返す必要があります。returnステートメント全体が無視されているようです。リターンをエコーに置き換えると、正しい値が表示されます。

期待される結果:
-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);

注:関数内のエコーはデバッグ用です。

前もって感謝します。

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 に答える