Php проверка на пустой массив

Php проверка на пустой массив

Часто возникают ситуации, когда нужно проверить существование или пустоту переменной. В PHP для этого есть функции isset() , empty() и array_key_exists() .

Проверка существования переменной

Функция isset() возвращает true , если переменная существует и её значение не null :

Если передать в isset несколько переменных, она вернёт true при существовании всех переменных:

Результат в браузере:

Операторы объединения с NULL

В PHP 7 появился оператор объединения с NULL (или NULL-коалесцентный оператор) ?? . Он позволяет получить значение переменной, если она задана и не равна NULL, а иначе — значение по-умолчанию:

В PHP 7.4 появился присваивающий оператор объединения с NULL ??= .Он позволяет удобно задать значение переменной, если эта переменная ещё не задана (либо равна NULL):

Проверка на пустоту

Напомню, переменная считается пустой (приводится к false), если она имеет одно из следующих значений:

  • 0 (целое или дробное)
  • » (пустая строка)
  • ‘0’ (строка с числом 0)
  • [] (пустой массив)
  • null

Функция empty() возвращает true , если переменная не существует или пустая:

Поведение isset() и empty() сначала может немного запутать: первая возвращает true при существовании переменной, вторая — при не существовании. К этому нужно просто привыкнуть.

На самом деле isset() и empty() , аналогично echo , являются синтаксическими конструкциями, а не функциями.

Функции isset() и empty() гасят ошибку обращения к несуществующей переменной. Это одна из причин, почему они не являются обычными функциями.

Существование элемента массива

Как мы узнали чуть выше, isset() возвращает false , если переменная существует, но имеет значение null .

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

Для этого в PHP существует функция array_key_exists() :

Какой из вариантов наиболее корректный, для проверки php массива на отсутствие в нём элементов?

5 ответов 5

Да все, в общем, корректны. Только в первом и четвертом случаях будет преобразование типа к bool, а третий подойдет только для индексных массивов. Есть еще вариант sizeof($arr) .

Возможно, наилучший вариант if ($arr === Array())

ОТВЕТ:

Проверять пуст массив через функции count и sizeof — не стоит, так как он тратить время на обработку. мизерное время, но тратит.

Лучшие варианты это:

ИССЛЕДОВАНИЯ:

  1. Данные ответ проверен через микротест со сложным массивом, с 40014 элементов и PHP 7.1
  2. Исполнение скрипта происходило на локальной машине (Open Server 5.2).
  3. Замер происходил через функцию php microtime()
  4. Результат проверялся трижды

РЕЗУЛЬТАТЫ ИССЛЕДОВАНИЙ:

  1. if(count($arr)) <. >: 0.0010001659393311 сек.
  2. if(sizeof($arr)) <. >: 0 сек.
  3. if($array) <. >: 0 сек.
  4. if(empty($arr)) <. >: 0 сек.
  5. if(array_shift($arr)) <. >: 0 сек.
  6. if($arr[0]) <. >: 0 сек.
  1. if(count($arr)) <. >: 0 сек.
  2. if(sizeof($arr)) <. >: 0.0010011196136475 сек.
  3. if($array) <. >: 0 сек.
  4. if(empty($arr)) <. >: 0 сек.
  5. if(array_shift($arr)) <. >: 0 сек.
  6. if($arr[0]) <. >: 0 сек.
  1. if(count($arr)) <. >: 0.00099992752075195 сек.
  2. if(sizeof($arr)) <. >: 0 сек.
  3. if($array) <. >: 0 сек.
  4. if(empty($arr)) <. >: 0 сек.
  5. if(array_shift($arr)) <. >: 0 сек.
  6. if($arr[0]) <. >: 0 сек.

ЧТО Я ЮЗАЮ:

Для себя использую if($arr) <. >и if($arr[0]) <. >, так как нет необходимости вызывать дополнительные функции — обертки

Читайте также:  Gtx 960 4gb обзор asus

(PHP 4, PHP 5, PHP 7)

empty — Проверяет, пуста ли переменная

Описание

Проверяет, считается ли переменная пустой. Переменная считается пустой, если она не существует или её значение равно FALSE . empty() не генерирует предупреждение, если переменная не существует.

Список параметров

До PHP 5.5 empty() проверяет только переменные, и попытка проверить что-то еще вызовет ошибку синтаксиса. Другими словами, следующий код не будет работать: empty(trim($name)). Используйте вместо него trim($name) == false.

Если переменная не существует, предупреждение не генерируется. Это значит, что empty() фактически является точным эквивалентом конструкции !isset($var) || $var == false

Возвращаемые значения

Возвращает FALSE , если var существует и содержит непустое ненулевое значение. В противном случае возвращает TRUE .

Следующие значения воспринимаются как пустые:

  • "" (пустая строка)
  • (целое число)
  • 0.0 (число с плавающей точкой)
  • "0" (строка)
  • NULL
  • FALSE
  • array() (пустой массив)

Список изменений

Версия Описание
5.5.0

empty() теперь поддерживает выражения, а не только переменные.

Проверка нечислового индекса строки возвращает TRUE .

Примеры

Пример #1 Простое сравнение empty() и isset() .

// Принимает значение true, потому что $var пусто
if (empty( $var )) <
echo ‘$var или 0, или пусто, или вообще не определена’ ;
>

// Принимает значение true, потому что $var определена
if (isset( $var )) <
echo ‘$var определена, даже если она пустая’ ;
>
?>

Пример #2 empty() и строковые индексы

В PHP 5.4 был изменен способ обработки строковых индексов в empty() .

Результат выполнения данного примера в PHP 5.3:

Результат выполнения данного примера в PHP 5.4:

Примечания

Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций.

При использовании функции empty() на недоступных (необъявленных) свойствах объекта будет вызван встроенный метод объекта __isset(), если он определен.

Смотрите также

  • isset() — Определяет, была ли установлена переменная значением, отличным от NULL
  • __isset()
  • unset() — Удаляет переменную
  • array_key_exists() — Проверяет, присутствует ли в массиве указанный ключ или индекс
  • count() — Подсчитывает количество элементов массива или чего-либо в объекте
  • strlen() — Возвращает длину строки
  • Таблица сравнения типов

User Contributed Notes 34 notes

Please note that results of empty() when called on non-existing / non-public variables of a class are a bit confusing if using magic method __get (as previously mentioned by nahpeps at gmx dot de). Consider this example:

class Registry
<
protected $_items = array();
public function __set ( $key , $value )
<
$this -> _items [ $key ] = $value ;
>
public function __get ( $key )
<
if (isset( $this -> _items [ $key ])) <
return $this -> _items [ $key ];
> else <
return null ;
>
>
>

$registry = new Registry ();
$registry -> empty = » ;
$registry -> notEmpty = ‘not empty’ ;

var_dump (empty( $registry -> notExisting )); // true, so far so good
var_dump (empty( $registry -> empty )); // true, so far so good
var_dump (empty( $registry -> notEmpty )); // true, .. say what?
$tmp = $registry -> notEmpty ;
var_dump (empty( $tmp )); // false as expected
?>

Читайте также:  Ассасин крид истоки отзывы ps4

The result for empty($registry->notEmpty) is a bit unexpeced as the value is obviously set and non-empty. This is due to the fact that the empty() function uses __isset() magic functin in these cases. Although it’s noted in the documentation above, I think it’s worth mentioning in more detail as the behaviour is not straightforward. In order to achieve desired (expexted?) results, you need to add __isset() magic function to your class:

class Registry
<
protected $_items = array();
public function __set ( $key , $value )
<
$this -> _items [ $key ] = $value ;
>
public function __get ( $key )
<
if (isset( $this -> _items [ $key ])) <
return $this -> _items [ $key ];
> else <
return null ;
>
>
public function __isset ( $key )
<
if (isset( $this -> _items [ $key ])) <
return ( false === empty( $this -> _items [ $key ]));
> else <
return null ;
>
>
>

$registry = new Registry ();
$registry -> empty = » ;
$registry -> notEmpty = ‘not empty’ ;

var_dump (empty( $registry -> notExisting )); // true, so far so good
var_dump (empty( $registry -> empty )); // true, so far so good
var_dump (empty( $registry -> notEmpty )); // false, finally!
?>

It actually seems that empty() is returning negation of the __isset() magic function result, hence the negation of the empty() result in the __isset() function above.

When you need to accept these as valid, non-empty values:
— 0 (0 as an integer)
— 0.0 (0 as a float)
— "0" (0 as a string)

function is_blank ( $value ) <
return empty( $value ) && ! is_numeric ( $value );
>
?>

This is similar to Rails’ blank? method.

= ‘ ‘ ;
var_dump (empty( $str )); // boolean false
?>

So remember to trim your strings first!

= ‘ ‘ ;
$str = trim ( $str );
var_dump (empty( $str )); // boolean true
?>

To add on to what anon said, what’s happening in john_jian’s example seems unusual because we don’t see the implicit typecasting going on behind the scenes. What’s really happening is:

(int)$a == $b -> true, because any string that’s not a number gets converted to 0
$b==(int)$c -> true, because the int in the string gets converted
and
$a==$c -> false, because they’re being compared as strings, rather than integers. (int)$a==(int)$c should return true, however.

Note: I don’t remember if PHP even *has* typecasting, much less if this is the correct syntax. I’m just using something for the sake of examples.

If you want to use empty() to evaluate an expression (not a variable), and you don’t have PHP 5.5+, you can do it by wrapping the call to empty in a function, like so:
function is_empty ( $var ) <

return empty( $var );

>
?>
Then you can do something like
if( is_empty ( NULL )) <
/* . */
>
?>
without issue, since the local variable $var is being tested rather than the expression in the function call itself.

Читайте также:  Sony bravia kdl 40wd653 приложения

test if all multiarray’s are empty

function is_multiArrayEmpty ( $multiarray ) <
if( is_array ( $multiarray ) and !empty( $multiarray )) <
$tmp = array_shift ( $multiarray );
if(! is_multiArrayEmpty ( $multiarray ) or ! is_multiArrayEmpty ( $tmp )) <
return false ;
>
return true ;
>
if(empty( $multiarray )) <
return true ;
>
return false ;
>

$testCase = array (
0 => » ,
1 => "" ,
2 => null ,
3 => array(),
4 => array(array()),
5 => array(array(array(array(array())))),
6 => array(array(), array(), array(), array(), array()),
7 => array(array(array(), array()), array(array(array(array(array(array(), array())))))),
8 => array( null ),
9 => ‘not empty’ ,
10 => "not empty" ,
11 => array(array( "not empty" )),
12 => array(array(),array( "not empty" ),array(array()))
);

foreach ( $testCase as $key => $case ) <
echo " $key is_multiArrayEmpty= " . is_multiArrayEmpty ( $case ). "
" ;
>
?>

OUTPUT:
========

0 is_multiArrayEmpty= 1
1 is_multiArrayEmpty= 1
2 is_multiArrayEmpty= 1
3 is_multiArrayEmpty= 1
4 is_multiArrayEmpty= 1
5 is_multiArrayEmpty= 1
6 is_multiArrayEmpty= 1
7 is_multiArrayEmpty= 1
8 is_multiArrayEmpty= 1
9 is_multiArrayEmpty=
10 is_multiArrayEmpty=
11 is_multiArrayEmpty=
12 is_multiArrayEmpty=

empty() should not necessarily return the negation of the __isset() magic function result, if you set a data member to 0, isset() should return true and empty should also return true. A simpler implementation of the __isset magic function would be:

public function __isset($key) <
return isset($this-><$key>);
>

I don’t understand why this isn’t included in stdClass and inherited by default.

I’m comparing behavior of `!` and `empty()`, find an undocumented behavior here.

just like cast-to-boolean, `empty()` cares about if SimpleXML object is made from emty tags.

`empty(simplexml_load_string(‘ ‘))` is TRUE

this behavior begins from php 5.1.0

7, in 5.0.x that’s FALSE

Note that checking the existence of a subkey of an array when that subkey does not exist but the parent does and is a string will return false for empty.

= array( ‘search’ => ‘1’ );
empty( $params [ ‘search’ ][ ‘filter’ ]); # returns false
?>

This is correct, per the documentation (http://php.net/manual/en/language.types.string.php); quite a bit down the page is the Warning: "Writing to an out of range offset pads the string with spaces. Non-integer types are converted to integer." ) I didn’t receive a warning but perhaps that’s correct too. depends on whether the string -> integer conversion is considered "illegal": "Illegal offset type emits E_NOTICE."

(i.e. since $params[‘search’] is a string, the ‘filter’ subscript is converted to 0, so the test becomes empty($params[‘search’][0]), which is obviously false), but it tripped me up enough to mistakenly file a bug report (which I’ve since closed).

Be careful, if "0" (zero as a string), 0 (zero as an integer) and -0 (minus zero as an integer) return true, "-0" (minus zero as a string (yes, I already had some customers that wrote -0 into a form field)) returns false. You need to cast your variable before testing it with the empty() function :

= "-0" ;
echo empty( $var ); // returns false
$var = (int) $var ; // casts $var as an integer
echo empty( $vat ); // returns true
?>

Ссылка на основную публикацию
Panel x keeper ru личный кабинет
Скачать Тут вы можете скачать АПK-файл "X-Keeper Panel" для Андроид бесплатно, апк файл версии - 1.1.2 для загрузки на ваш...
Mysql вывести последнюю запись
Это пример кода для выбора всех записей из таблицы. Может ли кто-нибудь показать мне, как выбрать последнюю запись этой таблицы?...
Mysql query error select distinct
I keep running into the same error, using MySQL. The totaal value is marked as wrong, but i have no...
Panther что это за папка
Member Статус: Не в сети Регистрация: 30.07.2006Откуда: Москва Зеленогр День добрыйНе так давно установил Windows 7 x64Диску С я выделил...
Adblock detector