isset()和array_key_exists()之间有什么区别?

Zac*_*112 395 php

以下两个函数调用如何比较:

isset($a['key'])

array_key_exists('key', $a)
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 501

array_key_exists肯定会告诉你数组中是否存在键,而isset只有true键/变量存在且不null存在时才会返回.

$a = array('key1' => '????', 'key2' => null);

isset($a['key1']);             // true
array_key_exists('key1', $a);  // true

isset($a['key2']);             // false
array_key_exists('key2', $a);  // true
Run Code Online (Sandbox Code Playgroud)

还有另一个重要的区别.isset$a存在时不抱怨,同时也不抱怨array_key_exists.

  • @Zacky日语.它只是说'foobar'. (213认同)
  • 我希望我理解chineese :) (53认同)
  • 我总是主张使用`isset()`因为我认为NULL应该总是与NO VALUE或NOT SET完全相同,以避免模糊. (18认同)
  • 还要注意ArrayAccess实现(包括ArrayObject)的含义.由于array_key_exists仅适用于数组,因此从5.3.0开始,如果在ArrayAccess对象上使用它,它将失败并生成警告,即使实际存在$ obj ['key'].isset()尊重对象和数组,所以如果你遵循"如果它像鸭子走路"的心态,使用isset()可以将类似数组的变量视为数组. (17认同)
  • @Wilt你想让我解释日语在600个字符评论中的作用吗?:)它说"fūbā",它与日语中的"foobar"一样接近. (12认同)
  • 我不明白为什么人们似乎认为一个人必须优于另一个人.他们是不同的; 他们回答不同的问题.大多数时候我使用`isset`,因为我想使用变量,如果它可用并且有值.但是,在某些情况下,null是一个有效值.例如,区分真(正),假(负)和空(未设置).我还经常使用`array_key_exists`来检查一组选项中是否存在键,然后设置默认值(如果不存在),以便稍后的代码不会触发未定义键的错误. (4认同)
  • 如果您对性能方面有什么好处有疑问,可以参考这两个功能的基准测试.http://juliusbeckmann.de/blog/php-benchmark-isset-or-array_key_exists.html (2认同)
  • @jgivoni我不得不反对,null仍然是一个值(或者更像是一个状态),因此null应始终被视为如此.我几乎从不使用`isset`,因为人们并不真正知道**索引是否存在**. (2认同)
  • `null`可以是常规值,但*表示*"无值"或"无以上".`null`本身并不是一个有用的值,因为它只能有一个值:`null`.因此,它只能有一个含义:"什么都没有".因此,如果`isset`表示"你没有这里的值",那么它*应该*实际上是无关紧要的,因为没有这样的变量(即没有值)或因为变量是'null`(即没有值).这是你应该努力的理想,但这种做法肯定会更加细致入微. (2认同)

Pat*_*her 116

之间array_key_existsisset,虽然两者都是非常快的[O(1)],isset是显著更快.如果这项检查发生了数千次,那么你想要使用isset.

应该注意的是,它们并不相同 - 当数组键存在但值为null,isset将返回falsearray_key_exists返回true.如果值可能是null,则需要使用array_key_exists.

  • @celwell,我认真地怀疑你在其他地方遇到另一个问题,如果简单地将`array_key_exists`切换为`isset`会给你297秒的速度提升. (21认同)
  • 无法强调这一点.只花了一整天弄清楚为什么一个脚本需要超过300个才能执行.切换到isset(),现在执行时间不到3秒. (13认同)
  • 检查`if(isset($ foo [$ key])|| array_key_exists($ key,$ foo))`应该给出与`array_key_exists`相同的结果,但是如果你知道你的数据只有很少的键指向`null ` (9认同)
  • 基准(100000运行):`array_key_exists()`:205 ms`is_set()`:35ms`isset()|| array_key_exists()`:48ms (9认同)
  • 你对执行时间的比较吓坏了我,我被迫使用array_key_exists,如果你的比较是真的那么这意味着当我们搬到生产服务器时我很害羞:( (3认同)
  • @dtbarne `isset($foo[$key])` 意味着 `$foo[$key] !== null`,所以这个测试没有意义! (2认同)

Rin*_*g Ø 13

回答一个老问题,因为这里没有答案似乎解决了"警告"问题(解释如下)

基本上,在这种检查数组中是否存在键的情况下, isset

  • 告诉我们是否定义了表达式(数组),并设置了键
  • 如果未定义var,则不会出现警告或错误,而不是数组......
  • 如果该键的值为null,则返回false

array_key_exists

  • 根据名称暗示是否存在数组中的键
  • 如果数组参数不是数组,则发出警告

那么我们如何检查一个键是否存在变量中可能为null的值

  • 可能是也可能不是数组
  • (或者类似地是多维数组的量,密钥检查发生在昏暗2和变暗1个值可能不为1个的阵列第一暗淡(等...))

没有得到警告,当它的值为null时没有错过现有的密钥(PHP开发人员的想法也是一个有趣的问题,但在SO上肯定不相关).当然,我们不想使用@

isset($var[$key]);            // silent but misses null values
array_key_exists($key, $var); // works but warning if $var not defined/array
Run Code Online (Sandbox Code Playgroud)

似乎is_array应该参与等式,但如果$var没有定义,它会发出警告,因此这可能是一个解决方案:

if (isset($var[$key]) || 
    isset($var) && is_array($var) && array_key_exists($key, $var)) ...
Run Code Online (Sandbox Code Playgroud)

如果测试主要是非空值,则可能更快.否则对于具有大多数空值的数组

if (isset($var) && is_array($var) && array_key_exists($key, $var)) ...
Run Code Online (Sandbox Code Playgroud)

会做的工作.


Mat*_*ijs 12

阵列上工作时,主要区别在于,array_key_exists返回true当该值null,而isset将返回false当阵列值被设定为null.

请参阅PHP文档站点上的isset.

  • `isset`返回*false*而不是*null*. (3认同)

Ant*_*dge 9

PHP函数array_key_exists()确定数组元素是否存在特定键或数字索引.但是,如果要确定密钥是否存在并且与相关联,则PHP语言构造isset()可以告诉您(并且该值不是null).array_key_exists()无法返回有关键/索引值的信息.


Ana*_*nax 6

功能isset()更快,请查看http://www.php.net/manual/en/function.array-key-exists.php#82867

  • 是的,但是要记住,如果将变量设置为“ null”的值,则“ isset()”将返回false。 (2认同)