如何检查数组元素是否存在?

php
2022-08-30 09:09:15

示例:我正在检查数组元素是否存在,如下所示:

if (!self::$instances[$instanceKey]) {
    $instances[$instanceKey] = $theInstance;
}

但是,我不断收到此错误:

注意:未定义的索引:在第 16 行的 /Applications/MAMP/htdocs/mysite/MyClass.php 中进行测试

当然,第一次想要一个实例,$instances不会知道密钥。我想我对可用实例的检查是错误的?


答案 1

您可以使用语言构造函数array_key_exists

isset应该快一点(因为它不是一个函数),但如果元素存在并且具有值,则会返回false。NULL


例如,考虑以下数组:

$a = array(
    123 => 'glop', 
    456 => null, 
);

而这三个测试,依靠:isset

var_dump(isset($a[123]));
var_dump(isset($a[456]));
var_dump(isset($a[789]));

第一个会得到你(元素存在,但不是空的):

boolean true

而第二个会得到你(元素存在,但为空):

boolean false

最后一个会得到你(元素不存在):

boolean false


另一方面,像这样使用:array_key_exists

var_dump(array_key_exists(123, $a));
var_dump(array_key_exists(456, $a));
var_dump(array_key_exists(789, $a));

你会得到这些输出:

boolean true
boolean true
boolean false

因为,在前两种情况下,元素存在 - 即使它在第二种情况下为空。当然,在第三种情况下,它不存在。


对于像您这样的情况,我通常使用,考虑到我从未在第二种情况下...但是现在选择使用哪一个取决于您;-)isset

例如,你的代码可以变成这样:

if (!isset(self::$instances[$instanceKey])) {
    $instances[$instanceKey] = $theInstance;
}

答案 2

array_key_exists() 与 isset() 相比速度较慢。这两者的组合(见下面的代码)会有所帮助。

它利用 isset() 的性能优势,同时保持正确的检查结果(即,即使数组元素为 NULL,也返回 TRUE)

if (isset($a['element']) || array_key_exists('element', $a)) {
       //the element exists in the array. write your code here.
}

基准比较:(摘自下面的博客文章)。

array_key_exists() only : 205 ms
isset() only : 35ms
isset() || array_key_exists() : 48ms

查看 http://thinkofdev.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/http://thinkofdev.com/php-isset-and-multi-dimentional-array/

进行详细讨论。


推荐