Перейти к содержимому

Как проверить пустой ли массив php

  • автор:

Как лучше всего проверить что в массиве нет элементов?

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

Отслеживать
20.5k 4 4 золотых знака 27 27 серебряных знаков 50 50 бронзовых знаков
ответ дан 20 мар 2012 в 8:20
14.7k 1 1 золотой знак 26 26 серебряных знаков 48 48 бронзовых знаков
ТРЕТИЙ — НЕ КОРРЕКТНЫЙ. Например, $a = [NULL]; — не пустой массив.
13 ноя 2017 в 2:22

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

Отслеживать
51.4k 86 86 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков
ответ дан 28 окт 2015 в 19:54
31 1 1 бронзовый знак
Постарайтесь писать более развернутые ответы. Поясните, на чем основано ваше утверждение?
29 окт 2015 в 13:08

ОТВЕТ:

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

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

1. if($arr) // Проверит на наличие элементов внутри 2. if(empty( $arr )) // Проверит существование переменной с массивом и наличие элементов внутри 3. if(array_shift( $arr )) // Проверит наличие первого элемента 4. if($arr[0]) // Проверит на наличие нулевого элемента, для индексного массива, который начинается с 0 

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

  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]) <. >, так как нет необходимости вызывать дополнительные функции — обертки

Отслеживать
20.5k 4 4 золотых знака 27 27 серебряных знаков 50 50 бронзовых знаков
ответ дан 13 ноя 2017 в 2:02
29 1 1 бронзовый знак
П.3 какая-то бессмыслица
18 мар 2021 в 9:10

П.4 тоже бессмыслица. проверяет не наличие элемента, а его пустоту. [0] при такой проверке вернет что массив не имеет элементов

18 мар 2021 в 9:28

Более оптимальный так как:

  • Код более читаемый — «Если переменная равна пустому массиву»;
  • Сразу идет контроль типов, и вы действительно сравниваете массив;
  • Не используются функции, а только сравнение, значит этот код будет работать немного быстрее;

Отслеживать
ответ дан 10 мая 2018 в 11:11
Alexey Pavlov Alexey Pavlov
11 2 2 бронзовых знака

В документации сказано, что массив без элементов интерпретируется как false. https://www.php.net/manual/ru/language.types.boolean.php#language.types.boolean.casting

var_dump((bool) array(12)); // bool(true) var_dump((bool) array()); // bool(false) 

Вот я и убедился, что самый быстрый способ

if ( $arr ) <> 
$arr = []; $a1000 = range(0, 1000); // 0,1,2. 1000 for( $i = 0; $i < 1000000; $i++) < $j = rand(0,20); if ( $j === 0 ) < $arr[] = []; >else < shuffle( $a1000 ); $arr[] = array_slice($a1000,0,$j); >> $t = microtime( true ); $n = count_not_empty1( $arr ); $t = microtime(true) - $t; echo 'if ( $a ): N='.$n.' T='.round($t*1000,4).' ms'.PHP_EOL; $t = microtime( true ); $n = count_not_empty2( $arr ); $t = microtime(true) - $t; echo 'if ( $a !== [] ): N='.$n.' T='.round($t*1000,4).' ms'.PHP_EOL; $t = microtime( true ); $n = count_not_empty3( $arr ); $t = microtime(true) - $t; echo 'if ( !empty($a) ): N='.$n.' T='.round($t*1000,4).' ms'.PHP_EOL; $t = microtime( true ); $n = count_not_empty4( $arr ); $t = microtime(true) - $t; echo 'if ( count($a) ): N='.$n.' T='.round($t*1000,4).' ms'.PHP_EOL; function count_not_empty1( &$arr ) < $n = 0; for( $i = 0; $i < 1000000; $i++ ) < if ( $arr[$i] ) < $n++; >> return $n; > function count_not_empty2( &$arr ) < $n = 0; for( $i = 0; $i < 1000000; $i++ ) < if ( $arr[$i] !== [] ) < $n++; >> return $n; > function count_not_empty3( &$arr ) < $n = 0; for( $i = 0; $i < 1000000; $i++ ) < if ( !empty($arr[$i]) ) < $n++; >> return $n; > function count_not_empty4( &$arr ) < $n = 0; for( $i = 0; $i < 1000000; $i++ ) < if ( count($arr[$i]) ) < $n++; >> return $n; > 
if ( $a ): N=952522 T=117.7402 ms if ( $a !== [] ): N=952522 T=122.844 ms if ( !empty($a) ): N=952522 T=125.299 ms if ( count($a) ): N=952522 T=128.9139 ms 

Как проверить пустой ли массив php

WordPress 6 с Нуля до Гуру

WordPress 6 с Нуля до Гуру

Этот курс научит Вас созданию самых разных сайтов на самой популярной в мире CMS — WordPress. Вы увидите установку и настройку локального сервера, разбор каждой настройки, каждой кнопки и каждого пункта меню в панели WordPress.

Также Вы получите и всю практику, поскольку прямо в курсе с нуля создаётся полноценный Интернет-магазин, который затем публикуется в Интернете. И всё это прямо на Ваших глазах.

Помимо уроков к курсу идут упражнения для закрепления материала.

И, наконец, к курсу идёт ценнейший Бонус по тому, как используя ChatGPT и создавая контент для сайта, можно выйти на пассивный доход. Вы наглядно увидите, как зарегистрироваться в ChatGPT (в том числе, и если Вы из России), как правильно выбрать тему для сайта, как правильно генерировать статьи для него(чтобы они индексировались поисковыми системами) и как правильно монетизировать трафик на сайте.

Уроки и статьи

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube

Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка

Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт

Мой аккаунт Моя группа

Какая тема Вас интересует больше?

Бесплатный курс

33 шага к финансовой независимости

33 шага к финансовой независимости

Данный курс представляет из себя чек-лист в PDF-формате с 33-мя последовательными шагами, пройдя которые Вы станете финансово независимым человеком. К этому чек-листу так же прилагается подробная видеоинструкция.

Чтобы получить Видеокурс,
заполните форму

Бесплатный онлайн-семинар

Как создать профессиональный Интернет-магазин

Как создать профессиональный Интернет-магазин

После семинара:

— Вы будете знать, как создать Интернет-магазин.

— Вы получите бесплатный подарок с подробным описанием каждого шага.

— Вы сможете уже приступить к созданию Интернет-магазина.

empty

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

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

Если переменная не существует, предупреждение не генерируется. То есть конструкция empty() — это краткий эквивалент конструкции !isset($var) || $var == false.

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

Возвращает true , если переданная в параметр var переменная не существует, содержит пустое значение или равно нулю, то есть ложно, подробнее о приведении значений к булевым типам рассказано в параграфе преобразование в логический тип. В остальных случаях возвращает false .

Примеры

Пример #1 Простое сравнение языковых конструкций empty() и isset() .

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

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

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

$expected_array_got_string = ‘somestring’ ;
var_dump (empty( $expected_array_got_string [ ‘some_key’ ]));
var_dump (empty( $expected_array_got_string [ 0 ]));
var_dump (empty( $expected_array_got_string [ ‘0’ ]));
var_dump (empty( $expected_array_got_string [ 0.5 ]));
var_dump (empty( $expected_array_got_string [ ‘0.5’ ]));
var_dump (empty( $expected_array_got_string [ ‘0 Mostel’ ]));
?>

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

bool(true) bool(false) bool(false) bool(false) bool(true) bool(true)

Примечания

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

Замечание:

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

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

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

User Contributed Notes 36 notes

9 years ago

$testCase = array(
1 => » ,
2 => «» ,
3 => null ,
4 => array(),
5 => FALSE ,
6 => NULL ,
7 => ‘0’ ,
8 => 0 ,

foreach ( $testCase as $k => $v ) if (empty( $v )) echo »
$k => $v is empty» ;
>
>
/**
Output
1=> is empty
2=> is empty
3=> is empty
4=>Array is empty
5=> is empty
6=> is empty
7=>0 is empty
8=>0 is empty
**/
?>

14 years ago

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
?>

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.

Объявить пустой массив php?

Как объявить пустой массив?
если $arr = array();
то заполнение начнется с индекса 1($arr[1]).
Можно так:
$arr = array();
unset($arr[0]);
но как это сделать правильнее и проще?

  • Вопрос задан более трёх лет назад
  • 23273 просмотра

2 комментария

Оценить 2 комментария

e_svirsky

с чего это вы интересно взяли что заполнение начнётся с индекса 1 в первом случае?
не нужно тянуть сюда паскаль
Решения вопроса 1

littleguga

littleguga @littleguga
Не стыдно не знать, а стыдно не интересоваться.
Вы ошибаетесь — заполнение идет с 0 индекса.(по ссылке fiddle)

$arr = array(); array_push($arr, "test"); print_r($arr);

Сами проверьте, вот здесь, например.
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 2

danil_sport

Danil Akhtarov @danil_sport
Web, android, C++
PHP.нет посмотри тут. В свое время помогло
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

elevenelven

Alex Safonov @elevenelven
Php Dev @ Amadeus
Это описывается в руководстве.
php.net/manual/en/function.array.php

 'January', 'February', 'March'); print_r($firstquarter); ?>

Как вариант, можете после наполнения массива, вставить в начало элемент, и убрать. Что двинет все ключи на 1.

$array = [1,2,3]; array_unshift($array, '' ); unset($array[0]);

Ответ написан более трёх лет назад
Михаил @Madfisht3 Автор вопроса

Нужно пустой массив объявить. Чтобы там не было элементов. Объявить, но так, чтоб он был не инициализирован.

Алексей Объявляйте массив как обычно (array() или []). При добавлении в массив указываете нужный ключ ($arr[1] = 3.14)

Михаил @Madfisht3 Автор вопроса

krypt3r: а если у меня заполнение идёт через array_push? Тогда у меня первый элемент будет пустой, на сайте это лишняя строчка пустая.

Михаил @Madfisht3 Автор вопроса
Neoline: 500 Ошибка.
Михаил @Madfisht3 Автор вопроса
Второй листинг эквивалентен unset($arr[0])

elevenelven

Alex Safonov @elevenelven

Алексей: Будьте добры, приведите полностью код который эквивалентен второму листингу. Я думаю вы не имеете ввиду

$arr = array(); unset($arr[0]); array_push($arr, 1);

vadimkot

Алексей: вы каким то не тем php пользуетесь — при инициализации массива в него никакие элементы не добавляются и если выполнить array_push() после инициализации, то в массиве появится элемент с индексом 0.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *