在数组中增加未设置变量/新键的好方法

时间:2016-03-03 15:38:12

标签: php lazy-initialization

由于某种原因,我经常发现自己做了类似的事情:

foreach($source as $key => $value) {
    if (!isset($arr[$key])) {
        $arr[$key] = 0; // or any other value
    }
    $arr[$key] += something($value);
}

当我有一个众所周知的数据来源时,有时我会这样做:

foreach($source as $key => $value) {
    @$arr[$key] += something($value);
}

避免日志垃圾邮件(我不想从日志中删除警告或通知)

还有其他更紧凑,更智能或更漂亮的方法吗?

2 个答案:

答案 0 :(得分:5)

PHP7有最简单的选择:

$arr[$key] = ($arr[$key] ?? 0) + something($value);

如果你没有处于更新的前沿,那么你会被这个更冗长但同样正确的版本所困扰:

$arr[$key] = (isset($arr[$key]) ? $arr[$key] : 0) + something($value);

你不应该为这么简单的事情压制错误。

答案 1 :(得分:1)

您可以使用

$arr[$key] = (array_key_exists($key, $arr) ? $arr[$key] : 0) + 10;

但我不认为上面的代码比

更具可读性
if (!array_key_exists($key, $arr)) {
    $arr[$key] = 0;
}
$arr[$key] += 10;

Sidenote isset与array_key_exists

array_key_exists()纯粹检查密钥是否存在,即使该值为NULL。

如果密钥存在且值为NULL,则isset()将返回false。

对于性能,isset()更快