PHP:处理未定义数组键的最快方法
在一个非常紧凑的循环中,我需要访问包含数百万个元素的数组中的数万个值。密钥可以未定义:在这种情况下,返回 NULL 而不显示任何错误消息是合法的:
数组键存在:元素的返回值。数组键不存在:返回 null。
我知道多种解决方案:
if (isset($lookup_table[$key])) {
return $lookup_table[$key];
} else {
return;
}
或
@return $lookup_table[$key];
或
error_reporting(0);
$return = $lookup_table[$key];
error_reporting(E_ALL);
return $return;
所有解决方案都远非最佳:
- 第一个需要在 B-TREE 中查找 2 个:一个用于检查是否存在,另一个用于检索值。这有效地使运行时加倍。
- 第二个使用错误抑制运算符,因此在该线路上产生巨大的开销。
- 第三个调用错误处理程序(将检查error_reporting设置,然后不显示任何内容),从而产生开销。
我的问题是,如果我错过了一种避免错误处理的方法,但却使用单个Btree查找?
要回答一些问题:
数组缓存复杂计算的结果 - 复杂计算以实时完成。在数十亿个可能的值中,只有数百万个产生有效的结果。数组看起来像 1234567 => 23457, 1234999 => 74361, ....它被保存到几兆字节的PHP文件中,并在执行开始时include_once-d。初始加载时间无关紧要。如果未找到该键,则仅表示此特定值不会返回有效结果。麻烦的是每秒50k +完成此操作。
结论
由于无法通过单个查找和错误处理来获取值,因此我很难接受单个答案。相反,我投票支持所有伟大的贡献。
最有价值的输入,其中:
- 使用array_key_exists,因为它比替代品更快
- 查看 PHP 的 QuickHash
关于PHP如何处理数组有很多困惑。如果检查源代码,您将看到所有数组都是平衡树。构建自己的查找方法在C和C++中很常见,但在PHP等高级脚本语言中不具有性能。