Php 如何最有效地检查数千个值的数组中是否存在单个值?

Php 如何最有效地检查数千个值的数组中是否存在单个值?,php,arrays,Php,Arrays,由于一组奇怪的情况,我需要确定已知集合中是否存在一个值,然后采取行动。考虑: 包含的文件如下所示: // Start generated code $set = array(); $set[] = 'foo'; $set[] = 'bar'; // End generated code require('that_last_file.php'); if(in_array($value, $set)) { // Do thing } 然后另一个文件将如下所示: // Start gene

由于一组奇怪的情况,我需要确定已知集合中是否存在一个值,然后采取行动。考虑:

包含的文件如下所示:

// Start generated code
$set = array();
$set[] = 'foo';
$set[] = 'bar';
// End generated code
require('that_last_file.php');

if(in_array($value, $set)) {
  // Do thing
}
然后另一个文件将如下所示:

// Start generated code
$set = array();
$set[] = 'foo';
$set[] = 'bar';
// End generated code
require('that_last_file.php');

if(in_array($value, $set)) {
  // Do thing
}
如前所述,数组的创建将来自生成的代码——一个进程将创建一个PHP文件,该文件将包含在带有
require
if
语句上方

我应该如何关心这个混乱的大小——以字节和数组值为单位?它可以很容易地得到5000个值。我应该如何关注5000值数组的开销?除了在数组中使用
,还有没有更有效的方法来搜索值?通过
require
包含5000行文件有多痛苦

我知道最终有更好的方法可以做到这一点,但我的局限性是集合的创建和逻辑必须包含在包含的PHP文件中。有一些奇怪的技术限制阻止了其他选项(即数据库查找)。

更快的方法是:

if (array_flip($set)[$value] !== null) {
    // Do thing
}
5000值数组实际上并没有那么糟糕,但如果它只是字符串,则更快的方法是:

if (array_flip($set)[$value] !== null) {
    // Do thing
}


一个5000值的数组真的没有那么糟糕,但是如果它只是字符串的话。

“我应该如何关心这个混乱的大小——以字节和数组值为单位?”-可以忽略地说,根据数组的大小,你不应该关心你自己。唯一的问题可能来自单个值的大小,如果它们真的很大,但在这种情况下,100个元素或10000个元素都无关紧要。如果你真的担心,我会说测试它。你可能会发现没有什么可担心的。你唯一的“真正”限制是可用内存。也许你也可以看看这个:(当然,iSet需要用作数组键的值,但根据具体情况,从原始数据数组创建一个值,然后使用它可能是一个选项。)@04FS我喜欢这些统计数据,谢谢。但我实际上并没有设置关键点,只是设置值。这有关系吗?如果我不指定键,只指定值,那么键设置为什么?如果检查键的速度更快,我是否应该执行类似于
$set['foo']=true的操作?“我应该如何关注这个混乱的大小——以字节和数组值为单位?”-可以忽略的是,Das@SeanBright说,基于数组的大小,你不应该担心自己。唯一的问题可能来自单个值的大小,如果它们真的很大,但在这种情况下,100个元素或10000个元素都无关紧要。如果你真的担心,我会说测试它。你可能会发现没有什么可担心的。你唯一的“真正”限制是可用内存。也许你也可以看看这个:(当然,iSet需要用作数组键的值,但根据具体情况,从原始数据数组创建一个值,然后使用它可能是一个选项。)@04FS我喜欢这些统计数据,谢谢。但我实际上并没有设置关键点,只是设置值。这有关系吗?如果我不指定键,只指定值,那么键设置为什么?如果检查键的速度更快,我是否应该执行类似于
$set['foo']=true的操作?你能进一步解释一下吗?你说的更快到底是什么意思?我的意思是,如果你对数字数组进行基准测试,这通常是检查数组中是否存在值的最快方法请返回实数数组。真的吗?如果你有兴趣的话,你自己去做基准测试并不困难。这是一种通过数字数组优化数组搜索的众所周知的方法,关键点查找比在_数组中快得多。如果提供一个合适的基准点这么容易,您可以这样做来增强您的答案。at的一个基准测试示例表明,
array\u flip
isset
相结合是最多10k个元素的数组的最慢选项。我在上修改了它,并且在_array中的
仍然要快得多。所以,为了完整性:在这个简单的基准测试中,我做错了什么?你能进一步解释吗?你说的更快到底是什么意思?我的意思是,如果你对数字数组进行基准测试,这通常是检查数组中是否存在值的最快方法请返回实数数组。真的吗?如果你有兴趣的话,你自己去做基准测试并不困难。这是一种通过数字数组优化数组搜索的众所周知的方法,关键点查找比在_数组中快得多。如果提供一个合适的基准点这么容易,您可以这样做来增强您的答案。at的一个基准测试示例表明,
array\u flip
isset
相结合是最多10k个元素的数组的最慢选项。我在上修改了它,并且在_array中的
仍然要快得多。那么,为了完整性:在这个简单的基准测试中,我做错了什么?