使用fopen(),fgets()和PHP进行流JSON解析器

3

以下是JSON文件的一部分。

{ 
"products": { 
"product" : [
{ "name" : "Desktop", "price" : 799.99, "memory" : "4GB"},
{ "name" : "Laptop", "price" : 999.99, "memory" : "3GB"},
{ "name" : "Notebook", "price" : 899.99, "memory" : "2GB"}
] }}

我需要解析一个非常大的JSON文件,然后根据用户查询显示相关的搜索结果。我想避免使用json_decode或file_get_contents将整个文件加载到内存中,而是逐行解析该文件。

$search_results = "";
$Json_file = fopen("products.json", "r");
while (!feof($Json_file)) {
$line_of_data .= fgets($Json_file);
$decoded_line = json_decode($line_of_data);

现在,我想使用 if 语句,以便 fgets() 函数只从 JSON 文件中获取“价格”值在900以下的数据。下面的 if 语句无法正常工作-它会导致页面完全空白,但是没有 if 语句时代码可以正常工作。我的问题是:有没有一种“性能友好”的编码方式(在代码的这个位置),使得无关的 JSON 数据可以被过滤掉,不会被放入下面的 search_results 变量中?或者有没有更好的方法来逐行解析大型 JSON 文件?

if ($decoded_line->products->product->price < 900) {  //assuming a site visitor is searching for an item under $900
$search_results .= decoded_line->products->product;
}
}

通过在上面的if语句中过滤掉不相关的JSON数据,我认为当我们在此处使用json_decode时会有助于整体性能。
$data = json_decode($search_results);
$product = $data->products->product;

foreach($product as $Product) {
echo $Product->name . " " . $Product->price;
echo "<br>";
}

fclose($Json_file);

非常感谢您提供的建议!
1个回答

0

将JSON写入本地数据库(如果尚未写入)并使用ajax调用和onkeychange事件以过滤的方式返回搜索结果,这是一个选择吗?


我想避免使用ajax和其他任何客户端相关的东西。我的主要目标是尽早过滤掉不相关的数据(从JSON文件中),以便在代码后期需要解码时,减少JSON_decode的解码量。 - KL86
你仍然可以通过数据库进行过滤吗? - Herb
有没有一种方法可以在没有数据库的情况下进行过滤(例如在我尝试使用if语句进行过滤的代码中)? - KL86
可以使用数组操作。将JSON解析为数组,然后您可以进行比较、排序等操作,但我认为唯一的方法是使用数据库,以便您可以在不将整个数据集存储在内存中的情况下对其进行处理。当然,除非您只需要一个小子集并且不必不断查询整个JSON文件。 - Herb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接