Этот вопрос о том, « Как определить, пуст ли массив PHP », заставил меня задуматься над этим вопросом.
Есть ли причина, которую count
следует использовать вместо того, чтобы empty
определять, пуст массив или нет?
Лично я подумал, что эти 2 эквивалентны для случая пустых массивов, которые вы должны использовать, empty
потому что это дает логический ответ на логический вопрос. Из приведенного выше вопроса кажется, что count($var) == 0
это популярный метод. Для меня, хотя это технически правильно, не имеет смысла. Например, Q: $ var, ты пуст? А: 7 . Хммм ...
Есть ли причина, по которой я должен использовать count == 0
вместо этого, или это вопрос личного вкуса?
Как указывали другие в комментариях к теперь удаленному ответу, это count
повлияет на производительность для больших массивов, потому что ему придется подсчитывать все элементы, тогда как он empty
может остановиться, как только он узнает, что он не пуст. Итак, если они дают те же результаты в этом случае, но count
потенциально неэффективны, зачем нам вообще их использовать count($var) == 0
?
false
PHP - вempty()
или нет необходимостиcount()
.if (!$myArray) { echo "array is empty"; }
sandbox.onlinephpfunctions.com/code/...empty()
.Ответы:
Я вообще пользуюсь
empty
. Я не уверен, почему люди действительно используют счетчик - если массив большой, счет занимает больше времени / имеет больше накладных расходов. Если вам просто нужно знать, пуст массив или нет, используйте пустой.источник
O(1)
количество элементов есть , поскольку PHP хранит количество элементов внутри. Посмотрите этот ответ stackoverflow.com/a/5835419/592454Мне было любопытно посмотреть, какая из них на самом деле быстрее, поэтому я написал простой скрипт для тестирования этих функций.
Поскольку я делал это, я также попытался проверить производительность при выполнении операций, которые обычно связаны с count () / empty ()
Используя PHP 5.4.39:
Использование HipHop VM 3.6.1 (dbg)
Выводы, если вы используете PHP:
empty () намного быстрее, чем count () в обоих сценариях, с пустым и заполненным массивом
count () выполняет то же самое с полным или пустым массивом.
Выполнение простой операции IF или просто логической операции - то же самое.
IF / ELSE немного эффективнее, чем (?:). Если вы не делаете миллиарды итераций с выражениями в середине, это совершенно несущественно.
Выводы, если вы используете HHVM:
empty () немного быстрее, чем count (), но незначительно.
[Остальное как в PHP]
В заключение, если вам просто нужно знать, пуст ли массив, всегда используйте empty ();
Это был просто любопытный тест, который был проведен без учета многих вещей. Это просто доказательство концепции и может не отражать производственные операции.
источник
if($x){
он быстрееif(empty($x)){
(работает только в том случае, если вы знаете, что$x
это было объявлено).count
иempty
вызовы в , если заявление. Потом доходитempty
и длитсяcount
. Но по сравнению с вашим в голом футляре пустой в десять раз быстрее! Простой тест массива: 0.104662, пустой: 0.177659, count: 1.175125 на PHP 5.6, иначе ваш код дает тот же результат в этой версии, что и вы упомянули. Просто это фальшивые результаты.Думаю, это только личные предпочтения. Некоторые люди могут сказать, что
empty
это быстрее (например, http://jamessocol.com/projects/count_vs_empty.php ), в то время как другие могут сказать,count
что лучше, поскольку изначально он был создан для массивов.empty
является более общим и может применяться к другим типам.Однако php.net дает следующее предупреждение
count
:Другими словами, если переменная не установлена, вы получите уведомление от PHP о том, что она не определена. Поэтому перед использованием
count
было бы предпочтительнее проверить переменную с помощьюisset
. Это не обязательно сempty
.источник
count
заключается в том, что он изначально был сделан для массивов ... но объекты могут быть реализованыCountable
, и вы можете передавать скалярные значенияcount()
и получать действительный результат.isset()
. Если вас беспокоят уведомления в PHP, вы должны уже объявить свой массив. Если вы позволите PHP динамически объявлять ваш массив, вы также получите уведомление в этот момент. Я думаю, что настоящий смысл предупреждения на php.net заключается в том, что вы не должны использовать егоcount
для определения, был ли массив объявлен или нет, поскольку он дает тот же результат, что и пустой массив.Есть случаи, когда вам нужно что-то сделать с непустым массивом, зная его размер:
Но я бы не рекомендовал использовать count, если вы не уверены на 100%, что вы считаете массив. В последнее время я занимался отладкой кода, в котором функция ошибки возвращалась
FALSE
вместо пустого массива, и я обнаружил следующее:вывод:
Итак, с тех пор я использую
empty
или,if(array() === $array)
чтобы быть уверенным, что у меня есть пустой массив .источник
count()
похоже, лучше работает с интерфейсами, подобными массивам, которые реализуютArrayAccess/Countable
.empty()
возвращает true для таких объектов, даже если у них нет элементов. Обычно эти классы реализуютCountable
интерфейс, поэтому если возникает вопрос «Содержит ли эта коллекция элементы?» не делая предположений о реализации, тогдаcount()
это лучший вариант.источник
empty
возвращает false для таких объектов, даже если у них нет элементов»?count
было бы более гибким и расширяемым решением, если когда-либо для вашего кода будет иметь смысл принимать коллекцию, реализованную "обычным" способом ... ИМО, это может быть единственным подходящим критерием для определения того, используете ли выcount
или другие способы ...count()
7.2 является то, что она больше не может принимать пустые переменные.В качестве альтернативы вы можете преобразовать переменную как логическое значение (неявно или явно):
Этот метод генерирует,
E_NOTICE
если переменная не определена, аналогичноcount()
.Для получения дополнительной информации см. Страницу руководства PHP по сравнению типов .
источник
empty()
случае, если вы явно пытаетесь избежать запуска E_NOTICE (что, как правило, плохая идея, IMO). Явное использование пустого значения приведет к ошибкам в коде.Лично я предпочитаю элегантность кодирования (по отношению к моему конкретному варианту использования). Я согласен с Дэном МакГи, поскольку count () не отвечает с правильным типом данных (в данном случае логическим) для рассматриваемого теста, вынуждая разработчика написать больше кода для заполнения оператора if.
Оказывает ли это какое-либо существенное влияние на производительность, спорный вопрос только для очень больших массивов (для которых вам, вероятно, в любом случае не хватит распределения памяти в большинстве настроек).
В частности, когда дело доходит до массива PHP $ _POST, на мой взгляд, гораздо более «логично» написать / увидеть:
источник
Надеюсь, это может помочь кому-то, хотя на него уже был дан ответ (и что-то обсуждали). В моем собственном сценарии я знаю, что все мои массивы состоят из 7 элементов (проверки были выполнены ранее в моем коде), и я выполняю операцию,
array_diff
которая, конечно, возвращает нулевой массив при равенстве.У меня было 34 секунды для
count
и 17 секунд дляempty
. Оба дают мне одинаковые вычисления, поэтому мой код все еще в порядке.Однако вы также можете попробовать
==
или===
как в PHP - проверьте, равны ли два массива . Лучшее, что я бы сказал, - это попробоватьcount
vsempty
vs== empty array
, а затем посмотреть, какой из них дает ваши собственные лучшие характеристики. В моем случаеcount
был самым медленным, поэтому я используюempty
сейчас ... буду проверятьserialize
дальшеисточник
Нет веских причин отдавать предпочтение
count($myArray) == 0
большемуempty($myArray)
. У них одинаковая семантика. Некоторые могут найти один более читабельным, чем другой. Один может работать немного лучше, чем другой, но вряд ли это будет существенным фактором для подавляющего большинства приложений php. Для всех практических целей выбор - дело вкуса.источник
count
когда вам нужно подсчитать, используйте,empty
когда вам нужно проверить, пуста ли коллекция. Конечно, есть крайние случаи, такие как строки или нули, но программист должен подумать о своем коде. Вы можете не соглашаться, вам разрешено.Иногда использование пустого является обязательным. Например этот код:
Если вы запустите этот код следующим образом: http://phpfiddle.org/main/code/g9x-uwi
Вы получите такой результат:
Поэтому, если вы
count
выводите пустой глобус, вы получите неправильный результат. Вы должны проверить на пустоту.Из документации glob :
Также проверьте этот вопрос: Почему count (false) возвращает 1?
источник
Поскольку переменная, проанализированная как отрицательная, вернется
int(1)
сcount()
Я предпочитаю
($array === [] || !$array)
проверять пустой массив.Да, нам следует ожидать пустой массив, но не следует ожидать хорошей реализации функций без принудительных возвращаемых типов.
Примеры с
count()
источник
Переделал, ребята, спасибо.
Хорошо, нет никакой разницы между использованием
empty
иcount
. Технически егоcount
следует использовать для массивов, аempty
также для массивов, а также для строк. Таким образом, в большинстве случаев они взаимозаменяемы, и если вы увидите документацию php, вы увидите список предложений,count
если вы находитесь в,empty
и наоборот.источник