array_key_exists ($ key, $ array) против! empty ($ array [$ key]) - PullRequest
13 голосов
/ 30 июля 2011

Я видел, как многие люди делают первое, есть ли какое-то преимущество в производительности, когда они делают одно против другого?Или это просто конфетка для глаз?Я лично использую последний каждый раз, так как он короче и лично мне удобнее читать.

Ответы [ 4 ]

13 голосов
/ 30 июля 2011

Другие ответы сосредоточены на различиях между двумя функциями. Это верно, но если исходный массив не содержит значений null или 0 или "", ... (пустые значения), вы можете сравнить скорость двух функций:

<?php

function makeRandomArray( $length ) {
    $array = array();
    for ($i = 0; $i < $length; $i++) {
        $array[$i] = rand(1, $length);
    }

    return $array;
}

function benchmark( $count, $function ) {
    $start = microtime(true);
    for ($i = 0; $i < $count; $i++) {
        $function();
    }
    return microtime(true) - $start;
}

$runs = 100000;
$smallLength = 10;
$small = makeRandomArray($smallLength);

var_dump(benchmark($runs, function() {
    global $small, $smallLength;
    array_key_exists(rand(0, $smallLength), $small);
}));
var_dump(benchmark($runs, function() {
    global $small, $smallLength;
    !empty($small[rand(0, $smallLength)]);
}));

Что дало мне следующие результаты:

Для небольшого массива:

  • array_key_exists: число с плавающей запятой (0,18357992172241)
  • empty: число с плавающей запятой (0,072798013687134)
  • isset: число с плавающей запятой (0.070242881774902)

Для относительно большого массива:

  • array_key_exists: число с плавающей запятой (0.57489585876465)
  • empty: float (0.0068421363830566)
  • isset: число с плавающей запятой (0,0069410800933838)

Так что, если возможно, быстрее использовать empty или isset.

6 голосов
/ 30 июля 2011

array_key_exists($key, $array) и !empty($array[$key]) могут давать разные результаты, поэтому это не вопрос производительности или предпочтений .

                              | array_key_exists($key, $array) | !empty($array[$key]) |
+-----------------------------+--------------------------------|----------------------+
| $array[$key] does not exist | false                          | false                |
| $array[$key] is truthy      | true                           | true                 |
| $array[$key] is falsey      | true                           | false                |

Вы можете видеть, что таблица истинности отличается для значений Falsey (false, 0, NULL и т. Д.). Следовательно, !empty($array[$key]) не подходит в ситуациях, когда можно считать значение Falsey присутствует , например. $array["number_of_children"] не следует проверять на пустоту, если значение 0 имеет смысл.


Вы можете использовать isset($array[$key]), который дает результаты, идентичные array_key_exists($key, $array), с одним исключением:

                                      | array_key_exists($key, $array) | isset($array[$key]) |
+-------------------------------------+--------------------------------|---------------------+
| $array[$key] does not exist         | false                          | false               |
| $array[$key] is truthy              | true                           | true                |
| $array[$key] is falsey but not NULL | true                           | true                |
| $array[$key] is NULL                | true                           | false               |
5 голосов
/ 30 июля 2011
$array = array(
    'foo' => null
);

echo (int)!empty($array['foo']); // 0
echo (int)array_key_exists('foo', $array); // 1
0 голосов
/ 30 июля 2011

Они оба разные

array_key_exists($key, $array) проверяет, существует ли ключ в массиве, и возвращает TRUE, если данный ключ установлен в массиве.

, тогда как

!empty($array[$key]) Определить, является ли значение переменной пустым или нет

...