Возможный дубликат:
PHP: «Примечание: неопределенная переменная» и «Примечание: неопределенный индекс»
Недавно включили ошибки, и я поймаю ошибку Undefined Index и Undefined Offset в строках, которые я увеличиваю на новый индекс массива.
Вот очень простой пример.
for($i = 0; $i<10; $i++) { $arr['var1'] += $val1[$i]; $arr['var2'] += $val2[$i]; }
Я получаю ошибку, потому что на первой итерации $ arr ['var1'] не задан.
Я обнаружил, что оба проверяют, что индекс установлен
if (!isset($arr['var1'])) { $arr['var1'] = 0; } $arr['var1'] += $val1[$i];
• а также •
автоматически устанавливая индекс с валом 0 перед тем, как инкремент forloop останавливает сообщения об ошибках.
Мой вопрос в том, что у меня будет около 150 из них, чтобы исправить, каким будет лучший способ подойти к этой проблеме. Проверьте isset на каждом из них или определите каждый из них заранее с помощью val 0?
Вы всегда должны инициализировать свои переменные. Это абсолютно лучшая практика практически на каждом языке, и считается крайне вредной привычкой обращаться к неустановленным переменным. Вы всегда должны разрабатывать программное обеспечение с ошибками.
Ваш код должен читать:
$arr['var1'] = $arr['var2'] = 0; for($i = 0; $i<10; $i++) { $arr['var1'] += $val1[$i]; $arr['var2'] += $val2[$i]; }
Возьмите удар, исправьте все 150 случаев этой проблемы, а затем узнайте из своей ошибки. Правильно напишите код в следующий раз.
Это личное предпочтение, так как одна и та же функциональность зависит от выбора. Однако, объявив это заранее, вы сохраните условный и функциональный вызов (который будет в цикле, повторен), поэтому с точки зрения эффективности лучше всего объявить его перед циклом. Как правило, наилучшей практикой является объявление переменных перед их использованием. Тем не менее, PHP позволяет вам уйти от таких вещей, поэтому это не требуется.
Сначала инициализируйте, затем выполните итерацию:
$arr['var1'] = 0; $arr['var2'] = 0; for($i = 0; $i<10; $i++) { $arr['var1'] += $val1[$i]; $arr['var2'] += $val2[$i]; }
Это гораздо более читаемый код – лучше, чем то, что вы делали.
Если вам нужно запустить массив с большим количеством счетчиков, вы можете сделать что-то вроде этого:
$arr = array('counter1' => 0, 'counter2' => 0, 'counter3' => 0);
Вы должны исправить эти области, только для хорошей практики кодирования. Подход, который вы используете, действительно зависит от вашего кода. Если вы действительно работаете с новыми переменными, тогда просто определяйте их как false, 0, '' или что-то имеет смысл как значение по умолчанию для рассматриваемой переменной.
Если вы находитесь в точке кода, где вы можете или не можете иметь значение (например, оценивать массивы $ _POST или $ _GET), используйте isset()
, empty()
или аналогичные для его оценки.
Записи массива появятся (автовивификация), если вы получите доступ к ним через ссылки. Таким образом:
for($i = 0; $i < 10; $i++) { $var1 =& $arr['var1']; $var2 =& $arr['var2']; $var1 += $val1[$i]; $var2 += $val2[$i]; }
Даже сам массив не нужно объявлять. По умолчанию новая запись будет иметь значение NULL, которое при добавлении преобразуется в 0.