как использовать лямбда-функцию как условие в троичном операторе - PullRequest
2 голосов
/ 09 мая 2011

Я пишу функцию, которая будет использоваться для ограничения слишком длинных строк. Я хочу избежать дублирования кода, поэтому я подумал, что поместить почти целую «логику» функции в выражение возврата будет лучше, чем проверка состояния в каждом случае переключателя. Но давайте посмотрим код:

function test($mode, $string) {
    $x = strlen("...");
    $overThr = function($x, $y){strlen($string) >= $y + $x + 1;}; 

    switch ($mode) {
        case 'artist_week':
            $y = 29;
            break;
        case 'songs_week':
            $y = 31;
            break;
    }
    return (substr($string, 0, $overThr($x, $y) ? $y : strlen($string))) . ($overThr($x, $y) ? "..." : "");
}

Как вы можете видеть, я хочу использовать $ overThr как гибкое условие в троичном операторе. Но я не могу понять, почему каждый раз, когда $ overThr выполняется в выражении «return», он всегда возвращает false.

$a = test('songs_week', 'razdwatrzyczterypiecszescsiedemrazdwatrzyczterypiecszescsiedem');
echo $a;
//razdwatrzyczterypiecszescsiedemrazdwatrzyczterypiecszescsiedem

кто-нибудь знает? :)

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

$string не определено в закрытии, и вы забыли оператор return

function ($x, $y) use ($string) {
  return strlen($string) >= $y + $x + 1;
};
1 голос
/ 09 мая 2011

Вы используете $string в лямбда-выражении, но не передаёте его в качестве параметра или не определяете его как global в лямбда-выражении, поэтому оно равно нулю / пусто.

...