2012-07-11 127 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 
    ) 
);