Случается, когда вы пытаетесь получить доступ к массиву с помощью ключа, который не существует в массиве.
Типичным примером для уведомления Undefined Index
будет ( demo )
$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];
Оба spinach
и 1
не существуют в массив, вызывающий запуск E_NOTICE
.
Решение состоит в том, чтобы убедиться, что индекс или смещение существуют до доступа к этому индексу. Это может означать, что вам необходимо исправить ошибку в вашей программе, чтобы убедиться, что эти индексы существуют, когда вы ожидаете их. Или это может означать, что вам нужно проверить, существуют ли индексы с помощью array_key_exists
или isset
:
$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
echo $data['spinach'];
}
else {
echo 'No key spinach in array';
}
Если у вас есть код например:
, тогда $_POST['message']
не будет установлена, когда эта страница будет загружена первой, и вы получите указанную выше ошибку. Только когда форма будет отправлена и этот код будет запущен во второй раз, будет существовать индекс массива. Вы обычно проверяете это с помощью:
if ($_POST) .. // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') .. // page was requested with POST
Вопросы, относящиеся:
Вы будете в состоянии использовать дополнительные методы LINQ непосредственно с List<object>
, но не с ArrayList
, если Вы не введете Cast<object>()
/ OfType<object>
(благодаря IEnumerable<object>
по сравнению с IEnumerable
). Это стоит вполне немного, даже если Вам не будет нужна безопасность типов и т.д.
, то скорость будет о том же; структуры будут все еще упакованы, и т.д. - таким образом, не будет очень еще, чтобы сказать им независимо. За исключением того, что я склонен видеть ArrayList
как "ой, кто-то пишет унаследованный код снова...";-p
Одно большое преимущество для использования List<object>
- то, что в эти дни большая часть кода записана для использования универсальных классов/интерфейсов. Я подозреваю, что в эти дни большинство людей записало бы метод, который берет IList<object>
вместо IList
. С тех пор ArrayList
не реализует IList<object>
, Вы не были бы в состоянии использовать список массива в этих сценариях.
я склонен думать о неуниверсальных классах/интерфейсах как об унаследованном коде и избегать их, когда это возможно.
В этом случае ArrayList
по сравнению с List<Object>
тогда Вы не заметите различий в скорости. Могли бы быть некоторые различия в фактических методах, доступных на каждом из них, конкретных в.NET 3.5 и подсчет дополнительных методов, но это больше имеет отношение к ArrayList, несколько удержавшему от использования, чем что-либо еще.
Да, помимо того, чтобы быть безопасными с точки зрения типов, универсальными наборами могло бы быть на самом деле быстрее.
Из MSDN ( http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx )
Система. Наборы. Универсальный пространство имен содержит интерфейсы и классы, которые определяют универсальные наборы, которые позволяют пользователям создавать наборы со строгим контролем типов, которые обеспечивают лучшую безопасность типов и производительность, чем неуниверсальные наборы со строгим контролем типов.
Сделайте некоторое сравнительное тестирование, и Вы будете знать то, что работает лучше всего. Я приблизительно оцениваю, что различие является очень небольшим.
List<> безопасная с точки зрения типов версия ArrayList. Это гарантирует, что Вы получите тот же тип объекта в наборе.