Инкремент несуществующего элемента массива без уведомления - PullRequest
1 голос
/ 04 мая 2019

Я хочу увеличить значение массива, который потенциально еще не существует.

$array = [];
$array['nonExistentYet']++; // Notice

Задача

Это приводит к УВЕДОМЛЕНИЮ .

Покушение

Я нашел способ сделать это, но он вроде неуклюжий :

$array = [];
$array['nonExistentYet'] = ($array['nonExistentYet'] ?? 0) + 1;

Вопрос

Есть ли более читабельный / элегантный способ сделать это?

Ответы [ 5 ]

2 голосов
/ 04 мая 2019

Если это часто используется, вы можете определить небольшой вспомогательный метод, который также использует интересный побочный эффект ...

function inc(&$element) {
    $element++;
}
$array = [];
inc($array['nonExistentYet']);
print_r($array);

дает ...

Array
(
    [nonExistentYet] => 1
)

без предупреждения. Как видите, функция определяет параметр как &$element, если это значение не существует, то оно будет создано, поэтому сам вызов функции создаст элемент, а затем просто увеличит его.

2 голосов
/ 04 мая 2019

ну, я думаю, более читабельный способ - использовать if..else как,

$arr = [];
if(array_key_exists('nonExistentYet', $arr)) {
    $arr['nonExistentYet'] += 1;
}
else {
    $arr['nonExistentYet'] = 1;
}
1 голос
/ 04 мая 2019

Моя стандартная реализация для этого:

if (isset($array['nonExistentYet']))
   $array['nonExistentYet']++;
else
   $array['nonExistentYet'] = 1;

Но это один из редких сценариев, где я использую оператор @ для подавления предупреждений, но только если у меня есть полный контроль над массивом:

@$array['nonExistentYet']++;

Обычно нецелесообразно подавлять предупреждения или сообщения об ошибках!

0 голосов
/ 04 мая 2019

То, что вы спрашиваете, немного расплывчато, Либо переменная существует и вы увеличиваете ее, либо она не существует, в этом случае вы создаете ее. В другом случае предположим, что вы хотите сделать это в цикле for, в этом случае вам не нужно беспокоиться о существовании переменной.

0 голосов
/ 04 мая 2019

Одним из способов является троичный оператор, который проверяет, существует ли значение массива:

$array['iDoNotExistYet'] = empty($array['iDoNotExistYet']) ? 1 : ++$array['iDoNotExistYet'];

Другой будет просто переписать его в состояние if и else.

...