PHP检索json值而不循环遍历整个json对象

时间:2013-07-29 00:56:06

标签: php json

我是PHP领域的新手,所以请忍受我的问题。

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

如果您正在寻找keyn,那么您可以这样做:

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

也许我错过了一些明显的东西。如果你想要防止对整个对象进行json_decode,那么你的问题会更有意义......但这不是你所要求的。

答案 1 :(得分:0)

来自JSON.org

  

JSON基于两种结构:

     

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

如果没有先使用json_decode()将其转换为可用对象,则无法与json进行交互。但是如果你知道了这些键,那么在运行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()是您的朋友。

答案 2 :(得分:-1)

没有使用任何类型的循环

,确实没有任何神奇的方法可以找到它

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

这就是我如何处理问题,而不必完成迭代整个树,如果匹配是foudn

$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;
}

答案 3 :(得分:-2)

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