2012-07-11 100 views
1

通常我可以使用類似脫身:的if/else三元運算符與空白Else語句問題

$a = ($condition)? array(1,2,3) : ''; 

但現在我有一個接受多維數組的方法,我必須通過或不通過的一個有條件的陣列。

$this->mymethod(
    'myarrays'=> array(
     array('key' => 'lang_code'), 
     array('key' => 'lang_description'), 
     array('key' => 'lang_direction'), 
     ($mycondition==true)? array('key' => 'lang_export') :), 
    ) 
); 

基本上,問題是最後一個數組傳遞。更具體地說,三元If運算符中的ELSE語句。看起來我不能在這之後傳遞一個空格,而且我不能傳遞其他任何東西,比如FALSE或''(空字符串),因爲稍後在代碼中運行這個數組的foreach會出錯。

我的問題是: 如何將參數傳遞給基於條件的函數/方法?

+0

嗯,是您的示例有效代碼嗎? – kapa 2012-07-11 08:25:40

+0

你不能傳遞一個「空」虛假陳述,我通常使用'null'。唯一允許的三元速記是'condition?:val_if_false',在這種情況下,如果條件不計算爲false,則返回條件值。 – Leigh 2012-07-11 08:27:21

+0

怎麼樣一個空數組而不是null /空字符串? – DThought 2012-07-11 08:21:47

回答

1
array_filter(array(
    array('key' => 'lang_code'), 
    array('key' => 'lang_description'), 
    array('key' => 'lang_direction'), 
    $mycondition ? array('key' => 'lang_export') : null), 
)); 

這將刪除null

+1

好戲。不要在生產代碼中使用。 – kapa 2012-07-11 08:42:58

+0

事實上,作爲ELSE語句傳遞null並通過array_filter()運行結果數組的做法訣​​竅。謝謝! – 2012-07-11 08:44:12

+0

@bažmegakapa,爲什麼這不適合生產? – 2012-07-11 08:45:37

1

用途:

$mycondition? array('key' => 'lang_export') : null 

現在,你可以簡單地通過array_filter(..)運行,刪除該NULL元素。

+0

爲什麼你會用'true'來比較表達式,而不是直接使用它呢?加上括號已經過時。 – 2012-07-11 08:32:58

+0

@TobiasSjösten:對,它來自OP的代碼。我會更新我的代碼。 – SuperSaiyan 2012-07-11 08:33:47

1

目的是爲了便於閱讀,而不是爲你怎麼能少打字。三元運算符非常好,因爲在某些情況下它增加了可讀性。這當然不是這種情況。

對以後閱讀你的代碼的人,包括你自己,很高興。

下面是一個例子(註釋是未來讀者的想法):

//OK, so here we have an array 
$array = array(
    array('key' => 'lang_code'), 
    array('key' => 'lang_description'), 
    array('key' => 'lang_direction'), 
); 

//So the array can have one more element based on this condition 
if ($mycondition) { 
    $array[] = array('key' => 'lang_export'); 
} 

//And then we pass this array to the method 
$this->mymethod(array('myarrays' => $array)); 

您可以自由使用變量,不必編寫所有的代碼在一個聲明(當然,我必須承認我以前覺得這很酷)。

0

您可以在函數調用之前評估條件,例如,與幫手功能:

function evaluate_condition (array $mandatory, array $optional, $condition) { 
    if (true === $condition) { 
     $mandatory[] = $optional; 
    } 
    return $mandatory; 
} 

$this->mymethod(
    'myarrays'=> $this->evaluate_condition(
     array(
      array('key' => 'lang_code'), 
      array('key' => 'lang_description'), 
      array('key' => 'lang_direction') 
     ), 
     array('key' => 'lang_export'), 
     $mycondition 
    ) 
);