是(isset(.)||array_key_exists(..))比仅检测array_key_exists


Is (isset(..) || array_key_exists(...)) a faster way of detecting null values than just array_key_exists(...))?

在研究如何检测数组中的null值时,我在http://www.php.net/manual/en/function.array-key-exists.php手册页。

它说

if (isset(..) || array_key_exists(...))
{
...
}

比更快

if array_key_exists(...))
{
...
}

100000次跑步的基准点是

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

我的问题:

(isset(..) || array_key_exists(...))array_key_exists()快吗?如果是,为什么?

编辑:写下这个问题,我想我找到了答案。我决定无论如何都发这个问题,看看我的想法是否正确。

哪个更快取决于您要检查的数组。如果数组包含值而不是null、"或0

if (isset(..) || array_key_exists(...)){    
}

上述代码将更快,因为isset将被检查,然后执行代码。Array_key_exists将不会运行。

如果数组包含null、"或0的值,则将测试isset,然后测试array_key_exists。这将比单独测试array_key_exists花费更长的时间。

因此,哪个更快的问题在很大程度上取决于您正在检查的数组。

很多人都说这其实并不重要。他们没有解释为什么这无关紧要。我想他们的意思是速度的提高是如此之小,以至于不值得麻烦。它们也可能意味着哪个更快取决于数组中分配的值(因此每次都不同)

不过,如果您知道大多数密钥将被分配除null、"或0以外的值,并且您确实需要确定何时分配null值,那么使用

if (isset(..) || array_key_exists(...)){    
}

很抱歉,要检测数组中的null值,您可以首先使用in_array检查数组,它会告诉您该数组是否包含"null"。我不太确定你想要实际实现什么,你想找到一个空值还是什么?当您告诉我们更多信息时,将进行编辑。

最可靠的方法是isset() || array_ky_exists(),因为它检查最多,短路评估将加快这一过程。

然而,正如pst在评论中所说:It just doesn't matter。真的,这最终几乎没有什么区别。

不过,基本上不是。最后,基础数学会告诉你,两次检查并不比一次检查快。