增加php循环中不存在的变量

时间:2018-05-20 15:00:37

标签: php loops variables

我有一个foreach循环,在其中我构建一个大的多维数组并且做了很多的控制,如下所示:

$totalCosts['sawn']['materials'] += $sawnMaterialsCost;

在循环的第一次迭代中,未设置关键'材料',因此它会抛出一个未定义的索引通知(不是很糟糕,但很烦人)。

我可以通过在循环之前定义它来解决这个问题:

$totalCosts['sawn']['materials'] = '0.00';

但是,我通过递增填充了许多键,我不喜欢在循环之前为每个键设置每个变量/键为'0'。是否有更好的方法来执行此操作,以便循环的第一次迭代检查值并在未找到时将其设置为1?

4 个答案:

答案 0 :(得分:2)

$totalCosts['sawn']['materials'] = ($totalCosts['sawn']['materials'] ?? 0) + $sawnMaterialsCost;

??,PHP 7中引入的运算符,如果定义了则使用左侧操作数而不是null,否则使用右侧操作数。

除非您进行数百万次比较,否则??的性能成本可以忽略不计。在亚马逊c3.medium上,我测量每个大约250ns,而不是静态分配。在10,000,000的循环中,这是一个半秒的惩罚。

perf.code.

答案 1 :(得分:1)

是 - 首先检查它是否存在,如果不存在,则创建它。

foreach($something as $key) { //e.g. $key = 'materials'
    if (!isset($totalCosts['sawn'][$key])) $totalCosts['sawn'][$key] = 0;
    $totalCosts['sawn'][$key] += $sawnMaterialsCost;
}

答案 2 :(得分:1)

嗯,我不认为有一种比这更紧凑的解决方案:

nil

答案 3 :(得分:1)

使用三元运算符是实现此目的的一种方法。

$totalCosts['sawn']['materials'] = !empty($totalCosts['sawn']['materials']) ? $totalCosts['sawn']['materials'] + $sawnMaterialsCost : $sawnMaterialsCost;

这样您就不会尝试添加不存在的值。