0

我正在尝试解析从远程 Web 服务生成的大量 JSON 数据。生成的输出跨 500 个 URI 进行分页,每个 URI 包含 100 个 JSON 对象。我需要将每个 JSON 对象中的属性,即 DOI(数字对象标识符)与从本地数据库中获取的相应字段进行匹配,然后更新记录。

我遇到的问题是控制我的循环结构以寻找匹配的 JSON DOI,同时确保所有数据都已被解析。

如您所见,我尝试使用 break 和 continue 语句的组合,但我无法“移动”到第一个 URI 之外。

后来我引入了一个标志变量来帮助控制循环而不影响。

 while($obj = $result->fetch_object()){       
       for($i=1;$i<=$outputs_json['meta']['response']['total-pages'];$i++){ 
         $url = 'xxxxxxxxxxxxxxx&page%5Bnumber%5D='."$i".'&page%5Bsize%5D=100';
         if($outputs = json_decode(file_get_contents($url),true)===false){
         }
         else{   
            try{
                $outputs = json_decode(file_get_contents($url),true); 
                $j=0;                   
                do{
                    $flag = false;
                    $doi = trim($outputs['data'][$j]['attributes']['identifiers']['dois'][0], '"');
                    if(!utf8_encode($obj->doi)===$doi) continue;                           
                    }else{
                        $flag = true;                   
                        $j++;
                    }
                }while($j!==101);
                  if($flag===true) break;
               } catch(Exception $e) {
            }       
        }   
    }
}

什么是保证解析所有 URI 上的每个 JSON 对象并且仅当获取的记录的 DOI 字段与传入 JSON 数据的 DOI 属性匹配时才在我的数据库上执行 CRUD 操作的最佳方法是什么?

4

1 回答 1

0

我不是 100% 确定我了解您问题的各个方面,但对我来说,更改执行顺序是有意义的

  • 从外部服务获取页面
    • 解码 json 并遍历所有 100 个对象
      • 获取一个 DOI
      • 从数据库中获取对应的记录
      • 更改数据库记录
    • 当所有 json 对象都进行时 - 获取下一个 url
  • 重复直到获取所有 100 个 url

我认为从本地数据库中获取一条记录并尝试在 100 个不同的远程调用中找到它并不是一个好主意——相反,最好将您的工作流/循环基于获取的远程数据并尝试在本地数据库中找到相应的元素

如果您认为这种方法适合您的任务 - 我当然可以帮助您编写代码 :)

于 2018-07-07T17:24:47.477 回答