Инкремент несуществующей переменной в цикле php - PullRequest
0 голосов
/ 20 мая 2018

У меня есть цикл foreach, внутри которого я создаю большой многомерный массив и выполняю множество инкриминирующих действий, например:

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

На первой итерации цикла ключ 'материалы 'не установлены, поэтому он генерирует неопределенное индексное уведомление (не страшно, но раздражает).

Я могу это исправить, определив его перед циклом следующим образом:

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

НОУ меня есть много ключей, которые я заполняю, увеличивая, и мне не нравится устанавливать каждую переменную / ключ на «0» для каждого перед циклом.Есть ли лучший способ сделать это, так что первая итерация цикла проверяет значение и устанавливает его в 1, если не найден?

Ответы [ 4 ]

0 голосов
/ 20 мая 2018
$totalCosts['sawn']['materials'] = ($totalCosts['sawn']['materials'] ?? 0) + $sawnMaterialsCost;

??, оператор, представленный в PHP 7, использует левый операнд, если он определен, и не ноль, в противном случае правый операнд.

Производительностьстоимость ?? незначительна, если вы не проводите миллионы сравнений.На Amazon c3.medium я измерял каждый на ~ 250 нс больше, чем статическое назначение.На цикле 10 000 000 это штраф за полсекунды.

perf.code.

0 голосов
/ 20 мая 2018

Ну, я не думаю, что есть более компактное решение, чем это:

foreach(...) {
    if(!isset($totalCosts['sawn'][$yourkey]))
       $totalCosts['sawn'][$yourkey] = 0.00;
    $totalCosts['sawn'][$yourkey]+=$sawnMaterialsCost;
}
0 голосов
/ 20 мая 2018

Использование троичного оператора - один из способов сделать это.

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

Таким образом, вы не будете пытаться добавить несуществующее значение.

0 голосов
/ 20 мая 2018

Да - сначала проверьте, существует ли он, а если нет, создайте его.

foreach($something as $key) { //e.g. $key = 'materials'
    if (!isset($totalCosts['sawn'][$key])) $totalCosts['sawn'][$key] = 0;
    $totalCosts['sawn'][$key] += $sawnMaterialsCost;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...