Некоторые достойные ответы, но просто подумал, что я немного расширю, чтобы объяснить более четко, когда PHP определяет, является ли массив пустым.
Основные примечания:
Массив с ключом (или ключами) будет определен как NOT empty с помощью PHP.
Поскольку значениям массива нужны ключи для существования, значения или нет в массиве не определяют, является ли он пустым, только если ключей нет (и, следовательно, нет значений).
Таким образом, проверка массива с empty()
не просто говорит вам, есть ли у вас значения или нет, это говорит вам, что массив пуст, а ключи являются частью массива.
Итак, рассмотрите, как вы создаете массив, прежде чем принимать решение о том, какой метод проверки использовать. EG В массиве есть ключи , когда пользователь отправляет вашу форму HTML, когда каждое поле формы имеет имя массива (т.е. name="array[]"
). Массив non empty будет создан для каждого поля, так как для каждого массива поля формы будут добавлены значения с автоматическим увеличением.
Возьмите эти массивы, например:
/* Assigning some arrays */ // Array with user defined key and value $ArrayOne = array("UserKeyA" => "UserValueA", "UserKeyB" => "UserValueB"); // Array with auto increment key and user defined value // as a form field would return with user input $ArrayTwo[] = "UserValue01"; $ArrayTwo[] = "UserValue02"; // Array with auto incremented key and no value // as a form field would return without user input $ArrayThree[] = ''; $ArrayThree[] = '';
Если вы выделите ключи массива и значения для указанных выше массивов, вы получите следующее:
ARRAY ONE: [UserKeyA] => [UserValueA] [UserKeyB] => [UserValueB]
ARRAY TWO: [0] => [UserValue01] [1] => [UserValue02]
ARRAY THREE: [0] => [] [1] => []
И тестирование вышеуказанных массивов с помощью empty()
возвращает следующие результаты:
ARRAY ONE: $ ArrayOne не пуст
ARRAY TWO: $ ArrayTwo не пуст
ARRAY THREE: $ ArrayThree не пуст
Массив всегда будет пустым, когда вы назначаете массив, но не используете его после этого, например:
$ArrayFour = array();
Это будет пустым, то есть PHP вернет TRUE при использовании if empty()
выше.
Итак, если ваш массив имеет ключи — либо, например, имена ввода формы, либо если вы назначили их вручную (т. е. создать массив с именами столбцов базы данных в качестве ключей, но не иметь значений / данных из базы данных), тогда массив НЕ будет empty()
.
В этом случае вы можете закодировать массив в foreach, тестируя, имеет ли каждый ключ значение. Это хороший метод, если вам все равно нужно проходить через массив, возможно, проверять ключи или дезинфицировать данные.
Однако это не лучший метод, если вам просто нужно знать, «если существуют значения», возвращает TRUE или FALSE . Существуют различные методы, чтобы определить, имеет ли массив какие-либо значения, когда он знает, что у него будут ключи. Функцией или классом может быть лучший подход, но, как всегда, это зависит от вашей среды и точных требований, а также от других вещей, таких как то, что вы сейчас делаете с массивом (если есть).
Вот подход, который использует очень маленький код для проверки того, имеет ли массив значения:
Использование array_filter()
: Итерирует по каждому значению в массиве, передавая их функции обратного вызова. Если функция обратного вызова возвращает значение true, текущее значение из массива возвращается в массив результатов.
$EmptyTestArray = array_filter($ArrayOne); if (!empty($EmptyTestArray)) { // do some tests on the values in $ArrayOne } else { // Likely not to need an else, // but could return message to user "you entered nothing" etc etc }
Выполнение array_filter()
во всех трех примерах массивов (созданных в первом блоке кода в этом ответе) приводит к следующему:
ARRAY ONE: $ arrayone не пуст
ARRAY TWO: $ arraytwo не пуст
ARRAY THREE: $ arraythree empty
Итак, когда нет значений, есть ли ключи или нет, используя array_filter()
для создания нового массива, а затем проверьте, пуст ли новый массив, показывает, были ли какие-либо значения в исходном массиве. Это не идеально и немного беспорядочно, но если у вас огромный массив и не нужно его прокручивать по какой-либо другой причине, то это самый простой с точки зрения кода.
У меня нет опыта проверки накладных расходов, но было бы полезно узнать различия между использованием array_filter()
и foreach
проверки, найдено ли значение.
Очевидно, что эталонный показатель должен быть по разным параметрам, на малых и больших массивах и когда есть значения и т. Д.
legkovopros.ru
Навеяно проблемой, с которой я столкнулся из-за неправильного использования функции isset() в одном китайском движке интернет магазина. Там isset() применялась для определения существования элемента массива с некоторым ключом. Самое неприятное в данной ситуации то, что такую ошибку допускают многие. Это не первый случай, когда isset() используется именно в таком контексте, хотя это в корне неверно. Но в этот раз неграмотность разработчиков стоила мне потерянного времени, что и сподвигло меня на эту заметку.
Еще больше меня «порадовали» комментарии одного «незнакомого» знакомого, который удивился моему негодованию. Как оказалось, о существовании функции array_key_exists() он что-то слышал, но сам никогда ею не пользовался. Более того, где-то читал, что ее лучше заменять на isset(), так как последняя работает быстрее.
Собственно, об уровне квалификации PHP программистов сказано немало и добавить к этому нечего.
Инициализация и удаление переменной в PHP
В PHP переменная инициализируется в момент присваивания ей значения. Неинициализированной переменная считается в двух случаях:
- ей не присваивалось никакого значения;
- ей было присвоено значение типа NULL или она была передана функции unset().
Присваивание NULL значения удаляет переменную, аналогично функции unset(), то есть делает ее неинициализированной.
Если попытаться использовать переменную, которая была удалена с помощью unset(), будет сгенерирована ошибка уровня E_NOTICE. С переменной, приведенной к NULL, такого не произойдет.
Функция isset()
Функция проверяет факт инициализации переменной. isset() вернет false, если передать ей в качестве параметра неинициализированную переменную. Тоже самое произойдет и с ключом массива, который имеет NULL значение. Для ключей массива действуют такие же правила приведения к NULL, как и для переменных.
$nullVar = null; var_dump($nullVar); $array = array( 'key_str' => 'foo', 'key_null' => null, 'key_int' => 1 ); var_dump($array);
Результат:
null array 'key_str' => string 'foo' (length=3) 'key_null' => null 'key_int' => int 1
Функция array_key_exists()
Работа функции array_key_exists() похожа на isset(), но с той лишь разницей, что даже для ключа с NULL значением будет возвращено TRUE.
$array = array( 'key_str' => 'foo', 'key_null' => null, 'key_int' => 1 ); var_dump(array_key_exists('key_null', $array)); // Вернет boolean true
Чтобы полностью удалить пару ключ-значение необходимо использовать unset().
Для массива использование NULL значения ключа удобно, если наличие ключа требуется сохранить. Можно будет рассчитывать на контекст, в котором данный ключ будет использован. Например, это удобно при заполнении полей формы дефолтными значениями. Например, при использовании конструкции echo, NULL значение будет приведено к пустой строке.
То, к чему я клоню, мне кажется очевидным. Если вы работаете с ключами массива, то используйте именно ту функцию, которая для этого предназначена. Ко всему прочему, использование array_key_exists() позволяет точно понять логику приложения. Никакой двусмысленности не возникает.
Скорость работы isset() и array_key_exists()
О том, что array_key_exists() работает медленнее isset() пишут даже в комментариях к соответствующей странице PHP мануала. Жалуются на то, что более медленная работа array_key_exists() заметна на массивах с количеством пар ключ-значение, превышающих 200.
Ничего не остается, как прогнать банальный тест:
$testArray = array( 883209 => 568420, 553314 => 266114, 133088 => 367615, // ... ); $timerStart = microtime(); for ($i = 0; $i < 100000; $i++) { //if (isset($testArray[rand(1, 99999)])); if (array_key_exists(rand(1, 99999), $testArray)); }; $timerEnd = microtime(); echo $timerEnd - $timerStart;
Ассоциативный массив $testArray содержит 10 000 элементов. Это несколько больше, чем упомянутые 200.
Далее прогоняем цикл с количеством итераций 100 000. В теле цикла, по очереди, сначала делаем проверку с помощью isset(), затем с помощью array_key_exists(). Ключ, наличие которого проверяем, генерируется случайным образом, чтобы свести к минимуму вероятность его существования в массиве.
isset() | array_key_exists() |
---|---|
0.687027 | 0.728652 |
Тест, безусловно, очень простой и достаточно субъективный. Было бы неплохо сделать замеры используемой памяти, например. Но глядя на результаты этого теста, у меня нет никакого желания продолжать заниматься мышиной возней. Очевидно, что выигрыша в скорости попросту нет.
Функция isset() и свойства объекта
Совсем клиническим случаем можно считать использование isset() для проверки существования свойства у объекта.
Не так часто, как в случае с массивами, но доводится встречать подобные условия:
class Foo { public $property = null; public function __construct() { } } $object = new Foo(); if (!isset($object->property)) { echo 'property not exists'; }
Случай вопиющий, так как использование NULL в качестве дефолтного значения свойств – очень распространенная практика. И проверять наличие свойства объекта через isset() просто недопустимо.
Для проверки существования свойства у объекта в PHP существует функция property_exists(). Как и array_key_exists(), property_exists() вернет TRUE даже в том случае, если значение свойства приведено к NULL.
Также замечу, что для использования property_exists() не требуется наличие объекта класса. Проверку можно произвести по имени класса и имени свойства.
class Foo { public $property = null; public function __construct() { } } var_dump(property_exists('Foo', 'property')); // Вернет true
Такое вот занимательное программирование.
omurashov.ru
От автора: у моего друга супруга очень ревнивая! Но товарищ все сносит и терпит, поскольку сильно любит с зазнобу. Вот только от чеснока, которым постоянно приправляет жена «рабочий» перекус мужа у него развилась страшная изжога. И чтобы не расстраивать любимую товарищ решил подрабатывать сайтостроением (денег на нормальную еду). Специально для него сегодня рассмотрим, как проверить массив PHP. Получается, что мы не только изучим новую тему, а и поможем человеку .
Зачем проверять?
Программный код, как и человека (если не доверяете ему), лучше проверить. А то случившийся из-за излишней доверчивости (или безалаберности) разработчика баг может негативно сказаться на работоспособности всего приложения. Причем это может быть не только обидно, но и чревато:
В общем, проверять нужно любой программный код. Именно поэтому в любом языке «навалом» различных встроенных функций, начинающихся с префикса is. Не является исключением и PHP.
Эти функции чаще всего возвращают значение типа bool. С их помощью удобно проверять код (переменные) на соответствие каким-либо условием. Например, можно удостовериться, что переменная является массивом. Для этого применим функцию is_array():

Проверяем пустоту
Теперь научимся, в PHP как можно проверить, что массив не пустой. Для этого используем языковую конструкцию empty.
В предыдущем примере массив не является пустым – значение каждого из его элементов равно пробелу. Но empty воспринимает это как «пустоту». Также данная конструкция вернет false и в следующих случаях:
Другие варианты
Для проверки можно применять еще одну встроенную функцию – isset(). Она также возвращает true, если задано значение переменной. Тогда проверка нашего массива будет выглядеть так:
Но использование этой функции нежелательно, поскольку она будет возвращать всегда true, если значение переменной не равно NULL.
Мы разобрались, в PHP как проверить массив на пустоту. А что, если нужно проверить содержимое каждого элемента массива? Пример реализации:
С массивами на сегодня все. А также не забываем, что мы спасли человека от изжоги. Получается, что программирование на PHP избавляет от различных хворей не хуже самых дорогих лекарств

webformyself.com
PHP-элемент функции синтаксиса из кода Javascript PHP-черты: как разрешить конфликт имен свойств? Эффективное сохранение загруженных пользователем изображений в файловой системе Проблемы с загрузкой файлов PHP Рассчитать количество месяцев между двумя датами в PHP? Как пользовательский часовой пояс закодирован в facebook Sphinx Поиск нескольких таблиц и совокупных результатов с использованием PHP API вычисление php float 2 десятичной точки PDO извлекает один столбец из таблицы в одномерный массив Получить только вторую последнюю запись – mysql-query Сброс соединения PHP при загрузке большого файла независимо от правильной настройки Создание SOAP-запроса с PHP – как добавить атрибуты в теги XML? Запрос на создание системы сообщений из разных соединенных таблиц Лучший способ реализовать метаязык, скомпилированный до PHP Рамка Yii: управление доступом на основе ролей
ruphp.com
The is_associative_array() and is_sequential_array() functions posted by 'rjg4013 at rit dot edu' are not accurate.
The functions fail to recognize indexes that are not in sequence or in order. For example, array(0=>'a', 2=>'b', 1=>'c') and array(0=>'a', 3=>'b', 5=>'c') would be considered as sequential arrays. A true sequential array would be in consecutive order with no gaps in the indices.
The following solution utilizes the array_merge properties. If only one array is given and the array is numerically indexed, the keys get re-indexed in a continuous way. The result must match the array passed to it in order to truly be a numerically indexed (sequential) array. Otherwise it can be assumed to be an associative array (something unobtainable in languages such as C).
The following functions will work for PHP >= 4.
<?php
function is_sequential_array($var)
{
return (array_merge($var) === $var && is_numeric( implode( array_keys( $var ) ) ) );
}
function is_assoc_array($var)
{
return (array_merge($var) !== $var || !is_numeric( implode( array_keys( $var ) ) ) );
}
?>
If you are not concerned about the actual order of the indices, you can change the comparison to == and != respectively.
php.net
Некоторые достойные ответы, но просто подумал, что я немного расширю, чтобы объяснить более четко, когда PHP определяет, является ли массив пустым.
Основные примечания:
Массив с ключом (или ключами) будет определен как НЕ пустой PHP.
В качестве значений массива нужны ключи для существования, имеющие значения или нет в массиве, не определяет, пуст ли он, только если нет ключей (и, следовательно, нет значений).
Итак, проверка массива с помощью empty()
не просто говорит вам, есть ли у вас значения или нет, это говорит вам, что массив пуст, а ключи являются частью массива.
Итак, рассмотрите, как вы производите свой массив, прежде чем принимать решение о том, какой метод проверки использовать.
EG Массив будет иметь ключи, когда пользователь отправляет вашу форму HTML, когда каждое поле формы имеет имя массива (т.е. name="array[]"
).
Для каждого поля будет создан непустой массив, так как для каждого массива полей формы будут введены автоматически увеличивающиеся значения ключей.
Возьмите эти массивы, например:
/* Assigning some arrays */ // Array with user defined key and value $ArrayOne = array("UserKeyA" => "UserValueA", "UserKeyB" => "UserValueB"); // Array with auto increment key and user defined value // as a form field would return with user input $ArrayTwo[] = "UserValue01"; $ArrayTwo[] = "UserValue02"; // Array with auto incremented key and no value // as a form field would return without user input $ArrayThree[] = ''; $ArrayThree[] = '';
Если вы выделите ключи массива и значения для указанных выше массивов, вы получите следующее:
МАССА ОДИН:
[UserKeyA] = > [UserValueA]
[UserKeyB] = > [UserValueB]ARRAY TWO:
[0] = > [UserValue01]
[1] = > [UserValue02]МАССА ТРИ:
[0] = > []
[1] = > []
И тестирование вышеуказанных массивов с помощью empty()
возвращает следующие результаты:
МАССА ОДИН:
$ ArrayOne не пустARRAY TWO:
$ ArrayTwo не пустМАССА ТРИ:
$ ArrayThree не пуст
Массив всегда будет пустым, если вы назначаете массив, но не используете его после этого, например:
$ArrayFour = array();
Это будет пустым, то есть PHP вернет TRUE при использовании if empty()
в приведенном выше.
Итак, если у вашего массива есть ключи - либо, например, имена ввода формы, либо если вы назначили их вручную (т.е. создайте массив с именами столбцов базы данных в качестве ключей, но нет значений/данных из базы данных), тогда массив НЕ be empty()
.
В этом случае вы можете зацикливать массив в foreach, проверяя, имеет ли каждый ключ значение. Это хороший метод, если вам все равно нужно проходить через массив, возможно, проверять ключи или дезинфицировать данные.
Однако это не лучший метод, если вам просто нужно знать, "если значения существуют" возвращает TRUE или FALSE. Существуют различные методы определения, имеет ли массив какие-либо значения, когда он знает, что у него будут ключи. Функция или класс могут быть лучшим подходом, но, как всегда, это зависит от вашей среды и точных требований, а также от других вещей, таких как то, что вы сейчас делаете с массивом (если есть).
Здесь используется подход, который использует очень мало кода для проверки того, имеет ли массив значения:
Использование array_filter()
:
Итерирует по каждому значению в массиве, передавая их функции обратного вызова. Если функция обратного вызова возвращает значение true, текущее значение из массива возвращается в массив результатов. Клавиши массива сохраняются.
$EmptyTestArray = array_filter($ArrayOne); if (!empty($EmptyTestArray)) { // do some tests on the values in $ArrayOne } else { // Likely not to need an else, // but could return message to user "you entered nothing" etc etc }
Запуск array_filter()
во всех трех примерах массивов (созданных в первом блоке кода в этом ответе) приводит к следующему:
МАССА ОДИН:
$ arrayone не пустARRAY TWO:
$ arraytwo не пустМАССА ТРИ:
$ arraythree пуст
Итак, когда нет значений, есть ли ключи или нет, используя array_filter()
для создания нового массива, а затем проверьте, пуст ли новый массив, показывает, были ли какие-либо значения в исходном массиве. Это не идеально и немного беспорядочно, но если у вас огромный массив и не нужно его прокручивать по какой-либо другой причине, то это самый простой с точки зрения кода.
У меня нет опыта проверки накладных расходов, но было бы полезно узнать различия между использованием array_filter()
и foreach
проверки наличия значения.
Очевидно, что эталонный тест должен быть по разным параметрам, на малых и больших массивах и когда есть значения, а не т.д.
qaru.site