使用三元运算符php在foreach之前改进is_array语句

时间:2013-04-09 15:53:18

标签: php arrays foreach ternary-operator

我有

if ( is_array($this->input->post("tolerance")) )
   foreach($this->input->post("tolerance")  as $tolerance) 
           $tolerances      .= $tolerance . " " ;
else
    $tolerances = 'Not defined';

我想缩短代码,因为我们都知道在获取数组值之前我们正在验证它是否是一个数组

那么缩短这个的正确方法是什么?

is_array($this->input->post("tolerance")) ? foreach($this->input->post("tolerance") as tolerance)  $tolerances .= $tolerance . " " : $tolerances = 'Not defined';

4 个答案:

答案 0 :(得分:3)

你应该/不能在保持foreach的同时缩短这一点。三元运算符不应该像这样使用。它用于表达式,而不用于语句。

很好的例子:

$foo = xyz() ? 'foo' : 'bar';

错误的例子:

xyz() ? foo() : bar();

更糟糕的例子(语法错误):

is_array($foo) ? foreach($foo as $bar) ...

缩短代码的唯一正确方法是使用临时变量和implode而不是循环:

$tolerance = $this->input->post('tolerance');
$tolerance = is_array($tolerance) ? implode(' ', $tolerance) : 'Not defined';

在这种情况下,三元运算符非常精细,因为现在你只需要在then / else部分中使用表达式而不是语句。

答案 1 :(得分:2)

尝试使用implode(),如下所示:

$tolerances = is_array($this->input->post("tolerance")) ? implode(' ', $this->input->post("tolerance")) : 'Not defined' ;

答案 2 :(得分:1)

我无法想到这样做的任何好方法,但要做到并且做一个:

/* @ == ignore expected warning, $r == assign on testing */
$tolerances = ($r = @implode(' ', $this->input->post("tolerance")) ) ? $r : 'Not defined';

我知道,大多数人认为这是不好的做法。

使用foreach的另一种选择:

$tolerances = is_array($arr=$this->input->post("tolerance")) ? call_user_func(function($p) { foreach($p as $t) $ts .= $t . " "; return $ts;}, $arr) : 'Not defined';

遵循“不良做法”的理念:如果它可能,那就意味着。

答案 3 :(得分:0)

$tolerances = ( is_array($this->input->post("tolerance")) == false ) ? "Not defined" : implode(" ", implode($this->input->post("tolerance"))) ;