2011-05-09 75 views
2

我正在寫一個函數,用於限制太長的字符串。我想避免重複的代碼,所以我認爲將幾乎整個函數「邏輯」放入返回表達式中比在每個開關的情況下檢查條件要好。但讓我們看看代碼:如何使用lambda函數作爲三元運算符的條件

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作爲三元運算符中的靈活條件。但我不明白爲什麼每次在$ returnThr中執行$ overThr都會返回false。

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

有人知道嗎? :)

+4

題外話,但可維護性的緣故,你應該打破return語句成多行。 (當然,你一眼就明白了,但在六個月內......) – 2011-05-09 18:19:05

+0

是的,這也是很好的提示。我想這也會對那些回答這個問題的人有所幫助:) – 2011-05-09 18:36:42

回答

2

$string不封閉內定義的,你忘了return聲明

function ($x, $y) use ($string) { 
    return strlen($string) >= $y + $x + 1; 
}; 
+0

用於添加'return'的+1。我刪除了我的答案。 – webbiedave 2011-05-09 18:28:05

+0

感謝您的提示:) – KingCrunch 2011-05-09 18:28:57

+0

沒問題。 --- – webbiedave 2011-05-09 18:29:36

1

您在lambda中使用$string,但未將其作爲參數傳入或在lambda中將其定義爲global,因此它爲空/空。

+2

請不要推薦'global'。 – KingCrunch 2011-05-09 18:28:21