我有一个foreach循环,在其中我构建一个大的多维数组并且做了很多的控制,如下所示:
$totalCosts['sawn']['materials'] += $sawnMaterialsCost;
在循环的第一次迭代中,未设置关键'材料',因此它会抛出一个未定义的索引通知(不是很糟糕,但很烦人)。
我可以通过在循环之前定义它来解决这个问题:
$totalCosts['sawn']['materials'] = '0.00';
但是,我通过递增填充了许多键,我不喜欢在循环之前为每个键设置每个变量/键为'0'。是否有更好的方法来执行此操作,以便循环的第一次迭代检查值并在未找到时将其设置为1?
答案 0 :(得分:2)
$totalCosts['sawn']['materials'] = ($totalCosts['sawn']['materials'] ?? 0) + $sawnMaterialsCost;
??
,PHP 7中引入的运算符,如果定义了则使用左侧操作数而不是null,否则使用右侧操作数。
除非您进行数百万次比较,否则??
的性能成本可以忽略不计。在亚马逊c3.medium上,我测量每个大约250ns,而不是静态分配。在10,000,000的循环中,这是一个半秒的惩罚。
答案 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;
这样您就不会尝试添加不存在的值。