我有
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';
答案 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"))) ;