Оператор добавления сокращений PHP – неопределенное смещение

Я использую оператор сокращения строк PHP для подсчета количества раз, когда определенный идентификатор встречается в многомерном массиве:

$source['tally'] = array(); foreach ($items as $item) { $source['tally'][$item->getId()] += 1; } 

При первом обращении к новому id он устанавливает значение «tally» равным 1, а затем увеличивает его каждый раз, когда он будет найден после этого.

Код работает отлично (я получаю правильные итоги), но PHP дает мне уведомление «Undefined Offset» каждый раз, когда он находит новый идентификатор.

Я знаю, что могу просто отключить уведомления в php.ini, но подумал, что должна быть причина, почему PHP не одобряет мою технику.

Является ли это плохой практикой, чтобы создать новый ключ / смещение динамически, как это, и есть ли лучший подход, который я должен использовать вместо этого?

Обратите внимание: чтобы помочь прояснить следующие первоначальные отзывы, я понимаю, почему дается уведомление. Мой вопрос: должен ли я что-нибудь сделать с этим или просто жить с уведомлением. Извиняюсь, если мой вопрос не сделал этого достаточно ясно.

Если вы просто хотите скрыть уведомление, вы можете использовать оператор управления ошибкой :

 $source['tally'] = array(); foreach ($items as $item) { @$source['tally'][$item->getId()]++; } 

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

 if (!isset( $source['tally'][$item->getId()] )) { $source['tally'][$item->getId()] = 0; } 

Вы должны понимать, что PHP-уведомления являются инструментом . Они существуют, поэтому у вас есть дополнительная помощь при написании кода, и вы можете легко обнаружить потенциальные ошибки. Типичным примером являются неинициализированные переменные. Многие разработчики спрашивают: не обязательно ли инициализировать переменные, почему PHP жалуется? Потому что он пытается помочь:

 $item_count = 0; while( do_some_stuff() ){ $iten_count++; // Notice: Undefined variable: iten_count } echo $item_count . ' items found'; 

Ой, я ошибся имя переменной.

 $res = mysql_query('SELECT * FROM foo WHERE foo_id=' . (int)$_GET['foo_id']); // Notice: Undefined index: foo_id 

К сожалению, я не предоставил значение по умолчанию.

Это просто еще один пример такой же ситуации. Если вы увеличиваете неправильный элемент массива, вы хотели бы узнать.

Использование += (или любого другого расширенного оператора присваивания) предполагает, что для этого ключа уже существует значение. Поскольку это не тот случай, когда первый раз встречается ID, извещение испускается и принимается 0 .

Это вызвано тем, что вы не инициализируете свой массив, чтобы содержать начальное значение 0 . Обратите внимание, что код, вероятно, будет работать, однако считается хорошей практикой инициализировать всю переменную, для которой вы собираетесь выполнить префикс. Таким образом, следующий код является примером того, что вы, вероятно, должны иметь:

 <?php $source['tally'] = array(); foreach ($items as $item) { //For each $item in $items, //check if that item doesn't exist and create it (0 times). //Then, regardless of the previous statement, increase it by one. if (!isset($source['tally'][$item->getID()]) $source['tally'][$item->getID()] = 0; $source['tally'][$item->getId()] += 1; } ?> 

Фактическая причина, почему PHP заботится об этом, заключается в том, чтобы предупредить вас об этом пустом значении (как если бы вы попытались его прочитать). Это своего рода ошибка, а не смертельный, убийственный сценарий, но более тонкий тихий. Вы все равно должны это исправить.