0

我有

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

4 回答 4

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 部分中只有一个表达式,而不是语句。

于 2013-04-09T15:54:34.763 回答
2

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

$tolerances = is_array($this->input->post("tolerance")) ? implode(' ', $this->input->post("tolerance")) : 'Not defined' ;
于 2013-04-09T15:56:25.207 回答
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';

只是遵循“不良做法”的哲学:如果可能,那就是它的意思。

于 2013-04-09T16:20:47.733 回答
0
$tolerances = ( is_array($this->input->post("tolerance")) == false ) ? "Not defined" : implode(" ", implode($this->input->post("tolerance"))) ;
于 2013-04-09T16:00:12.867 回答