0

我是 PHP 领域的新手,所以请耐心等待我的问题。

基本上我有/将有一个非常大的 json 文件,我需要根据提供的密钥查询文件以获取单个条目。一个例子如下:

{
"key1" : {value1},
"key2" : {value2},
...,
"keyn" : {valuen}
}

在任何一个请求中,我只需要检索一个值,并希望获得更好的性能。

在我的搜索中处理 PHP 中这种处理的基本方法是使用json_decode()然后foreach.

但是,这种方法似乎需要根据密钥的顺序和我要查找的密钥来遍历整个文件。因此,如果我正在寻找 keyn,那么基本上我必须从大文件的顶部到底部读取。(是的,我可以使用某种排序算法来获得更好的结果)

但据我了解,JSON 基本上是 HashMap 的另一种形式,所以鉴于 HashMap 可以get轻松快速,在 PhP 中是否有类似的方法可以从中获得最佳性能?

4

4 回答 4

3

好吧,鉴于您提供的结构,您绝对不需要遍历整个对象。

如果您正在寻找keyn,您只需执行以下操作:

$obj = json_decode($input);
echo $obj->keyn;

也许我错过了一些明显的东西。如果您想避免必须对整个对象进行 json_decode ,那么您的问题虽然更有意义......但这不是您要问的。

于 2013-07-29T01:26:40.873 回答
0

来自 JSON.org

JSON 建立在两种结构之上:

名称/值对的集合。在各种语言中,这被实现为对象、>记录、结构、字典、哈希表、键控列表或关联数组。值的有序列表。在大多数语言中,这被实现为数组、向量、列表或>序列。

你不能只与 json 交互而不首先使用json_decode()它来将它变成一个可用的对象。但是如果你知道键,在运行之后json_decode()你就可以和它进行交互(因为它现在是一个对象)。例如:

<?php
$string = '{"foo": "bar", "cool": "attr"}';
$result = json_decode($string);

// Result: object(stdClass)#1 (2) { ["foo"]=> string(3) "bar" ["cool"]=> string(4) "attr" }
var_dump($result);

// Prints "bar"
echo $result->foo;

// Prints "attr"
echo $result->cool;
?>

在这种情况下,var_dump()print_r()你的朋友。

于 2013-07-29T01:25:15.037 回答
-1

真的没有任何神奇的方法可以在不使用任何循环的情况下找到值

我没有对此进行基准测试:

如果找到匹配项,这就是我无需完成对整个树的迭代即可解决问题的方法

$key = 'keyn'
$obj = json_decode(file_get_contents('path/to/your/file'), true);
$len = count($obj);
$match = false;

for($ii = 0; $ii < $len; $ii++){
   $curr = $obj[$ii];
   if($curr == $key) {
     $match = $curr;
   }
   break;
}
于 2013-07-29T01:14:17.203 回答
-2

在 PHP 中,您可以使用函数:file_get_contents 来解析 JSON 文件。你必须遍历每一个键值对。

于 2013-07-29T01:09:28.570 回答