php - 使用 fopen()、fgets() 和 PHP 的流式 JSON 解析器

标签 php json parsing fopen fgets

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 语句的情况下工作正常。我的问题是:是否有一种“性能友好”的方式来编写 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);

非常感谢您的任何建议!

最佳答案

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

关于php - 使用 fopen()、fgets() 和 PHP 的流式 JSON 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24973044/

相关文章:

php - 从复选框中选择数据库检索的值并在另一个页面中查看,但是重新加载页面时不会显示结果。怎么解决?

java - 来自 Jackson 2.2 的 ObjectMapper 的 pretty-print JSON

php - 如何输出带有变量的html

php - 如何在 Laravel Blade 中创建动态生成的下拉菜单

php - 如何检查 while() 是否是无限的?

javascript - 访问嵌套 json 对象时的值替换

javascript - HTML 表 SBadmin Bootstrap 来自 JSON

java - JSONException:没有值(value)(解析 JSON 图像)

c++ - 在 C++/Qt 中拆分 Lua 函数调用的混合字符串/数字参数列表

php - 动态创建 .ics 文件