有没有更快的方法来搜索json数组中的项目

时间:2013-08-09 11:16:56

标签: php json

假设我将dataID存储在json文件中,包含1,000,000条记录。

我的zresults.json = {“dataID”:[“1”,“2”,“3”,...“1000000”]} z

我想在数组中找到ID“100000”。

$file = file_get_contents('results.json');
$data = json_decode($file,true);
if(in_array('100000', $data['dataID']))
{
  echo "found";
} else {
  echo "not found"; 
}

耗时约0.6秒。为了结果。

在这样的json数组中搜索是否有更快的方法?

请举个例子!

提前谢谢。

更新

虽然sql会快得多,但在一张表中考虑1,000,000条记录,记录的空间越大!至少,静态文件减少了服务器负载并减少了空间。

这取决于您的系统设计方式。在正确的时间和地点使用它!

5 个答案:

答案 0 :(得分:2)

当然!

$stm = $pdo->prepare("SELECT 1 FROM data WHERE id = ?");
$stm->execute(array(100000));
if ($stm->fetchColumn())
{ echo "found"; } else { echo "not found"; }

您需要先将数组导入数据库。

答案 1 :(得分:1)

根据results.json文件中数据的结构,您可以进行简单的字符串搜索,例如

$file = file_get_contents('results.json');

if(strpos($file, '"100000"') !== false)
{
    echo 'found';
}
else
{
    echo 'not found';
}

在对你的方法进行基准测试后,我得到了大约0.78秒(在我缓慢的本地系统上),但是使用这种方法,我实现了大约0.03秒。

就像我说的那样,这取决于你的数据结构,但如果它允许你使用这种方法,你会看到显着的速度优势。

答案 2 :(得分:0)

为什么不将id存储为键,然后执行:

if(isset($data['dataID']['100000'])){
 // do something
}

因为检查密钥是否存在比循环遍历数组要快得多。您可以查看此链接以获取更多信息:

List of Big-O for PHP functions

答案 3 :(得分:0)

基于文档的数据库如mongo DB是您应该尝试的,而不是使用普通的json文件 - 如果您绑定了json格式。

请注意,mongoDB可以将json对象保留在内存中,而普通的PHP解决方案必须一次又一次地解析文件。

我看到三个性能提升:

  • 减少磁盘IO
  • 少解析
  • 基于索引的搜索

答案 4 :(得分:0)

也许可以尝试预测结果,然后可以使用in_array在更小的json中搜索值。

否则你可以尝试其他搜索算法,这些算法很复杂。