Оператор добавления сокращенной записи PHP - неопределенное смещение - PullRequest
2 голосов
/ 15 ноября 2011

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

$source['tally'] = array();

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

В первый раз, когда он достигает нового идентификатора, он устанавливает значение 'tally' равным 1, а затем увеличивает его при каждом обнаружении после этого.

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 15 ноября 2011

Вы должны понимать, что уведомления 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

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

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

1 голос
/ 15 ноября 2011

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

$source['tally'] = array();

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

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

if (!isset( $source['tally'][$item->getId()] ))
{
   $source['tally'][$item->getId()] = 0;
}
1 голос
/ 15 ноября 2011

Это вызвано тем, что вы не инициализируете свой массив, чтобы содержать начальное значение 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 заботится об этом, состоит в основном в том, чтобы предупредить вас об этом пустом значении (так же, как если бы вы попыталисьпрочитайте это).Это своего рода ошибка, не фатальная, убивающая сценарий, но более тонкая и тихая.Вы все равно должны это исправить.

1 голос
/ 15 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...