设置或添加关联数组的数值的简短方法?

时间:2016-12-11 16:04:58

标签: php

是否有更短的方法来完成以下任务?

<?php
    $arr = [];

    // ...

    if(isset($arr['key']))
        $arr['key'] += 10;
    else
        $arr['key'] = 10;
?>

4 个答案:

答案 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秒!