是否有更短的方法来完成以下任务?
<?php
$arr = [];
// ...
if(isset($arr['key']))
$arr['key'] += 10;
else
$arr['key'] = 10;
?>
答案 0 :(得分:1)
使用三元运算符:尝试
<?php
$arr = [];
// ...
$arr['key']= isset($arr['key'])?($arr['key']+10):10;
答案 1 :(得分:1)
@$arr['key'] += 10;
似乎是最短的解决方案。
有什么要反对的吗?真的不确定@
是否会导致效率低下
答案 2 :(得分:1)
您有几种解决方案:
在参数上使用
&
这暗示了对每个变量的函数的新调用。不适合资源,仅适用于编码风格:)
<?php
function addOrDefine(&$variable, $value, $defaultValue = null) {
if( !isset($variable) )
$variable = $defaultValue;
$variable += $value;
return $variable;
}
$varA = addOrDefine($array['toto'], 10);
$varA = addOrDefine($array['toto'], 10);
var_dump($varA); // output '20'
?>
您可以创建一个定义函数:
<?php
function variableDefine(&$variable, $defaultValue = null) {
if( !isset($variable) )
$variable = $defaultValue;
return $variable;
}
$varA = variableDefine($varA);
$varB = variableDefine($_GET['varB'], 'defaultvalue');
?>
<?php
if( !isset($array['toto']) ) {
$array['toto'] = null;
}
$array['toto'] += 10;
?>
可以简化:
<?php
if( !isset($array['toto']) )
$array['toto'] = null;
$array['toto'] += 10;
?>
或者:
<?php
if( !isset($array['toto']) ) $array['toto'] = null;
$array['toto'] += 10;
?>
如果变量不存在,则使用默认值分配值。之后,像往常一样使用变量。
<?php
$varA = isset($array['toto']) ? $array['toto'] : 10;
// or
// if you want to use the previous point
$array['toto'] = isset($array['toto']) ? $array['toto'] : null;
$array['toto'] += 10;
?>
$varA
是所需变量的值,如果它不存在,则为默认值。
答案 3 :(得分:1)
如果您使用的是PHP7,则可以利用新的??
null coalescing operator。 (“... 返回第一个操作数,如果存在且不为NULL;否则返回第二个操作数。”)
$arr['key'] = ($arr['key'] ?? 0) + 10;
上面发生的事情:括号中的表达式将$arr['key']
设置为0(如果未定义),否则保持原样;并且+10被添加到结果中。这是最短的方法。
最常见且易于理解的解决方案是使用? :
三元运算符:
$arr['key'] = isset($arr['key']) ? $arr['key'] + 10 : 10; // or:
$arr['key'] = !isset($arr['key']) ? 10 : $arr['key'] + 10;
您也可以这样做:
isset($arr['key']) && ($arr['key'] += 10) || ($arr['key'] = 10); // or:
!isset($arr['key']) && ($arr['key'] = 10) || ($arr['key'] += 10);
结论:PHP中没有针对“define-if-not-exists”的内置解决方案,如果您尝试增加一个不存在的变量,将会出现警告。
至于其他一些答案:我不会用@来压制错误,不是很好的做法。保持简短,而不是hackish。在每个变量增量上发生单独的函数调用似乎过多。
对于那些即将进行微观优化的人,以及那些需要了解的探究者;每个10M迭代的基准。定义一次然后循环递增; Ex.1 :2.43秒; Ex.2a :2.93秒; Ex.2b :3.03秒, Ex.3a :3.12秒, Ex.3b :3.02秒。 ...当未设置&amp;在每次迭代中定义; Ex.1 :3.49秒, Ex.2a :3.22秒, Ex.2b :3.86秒, Ex.3a :3.78秒, Ex.3b :4.50秒。 (对于上下文,简单地定义变量10M次需要1.85秒,未设置+重新定义需要2.67秒。)
由于直接在C中检查变量而不是引发PHP isset函数调用,因此Null-coalescing和三元运算符将表现更好。在第一次测试中,误差抑制@$arr['key'] += 10;
逼近时钟为2.39秒;但是每当触发错误抑制时,在第二个时钟会受到重罚; 8.34秒;如果我将框架的错误处理程序保留在其上,则会高达53.7秒!