PHP - 将新的JSON对象附加到JSON对象中的嵌套数组

时间:2015-06-24 21:58:21

标签: php arrays json nested

设置

我使用'file_get_contents'从URL中检索了一个JSON字符串,然后使用`json_decode'解码它

$search_URL="http://abcdefg.com"
$json = file_get_contents($search_URL);
$obj = json_decode($json, true);

JSON代表Apache Solr搜索响应:

{  
  "responseHeader":{  
    "status":0,
    "QTime":3,
    "params":{  
      "q":"zzzzzzz",
      "wt":"json"
    }
  },
  "response":{  
    "numFound":20690,
    "start":0,
    "docs":[  
      {  
        "title":"yyyyy-y-y-yyyyy-yy-y",
        "author":"author 1, author 2, author 3",
        "url":"https://yyyyy.com",
        "id":yyyy,
        "_version_":yyyyy
      },
      {  
        "title":"xxxx-x-x-xxxx-xxxx",
        "author":"author 1, author 2",
        "url":"https://xxxxx.com",
        "id":xxxxx,
        "_version_":xxxxxx
      },
  ]
}
}

我基本上需要抓取author数组中的每个docs[]字段,用逗号分隔以获取新数组

$author_array = explode(", ", $author);

然后我需要调用另一个带有这些作者姓名的Web服务,这些服务名称将返回JSON.我希望简单地将这个JSON插入我现有的JSON中并将其全部发送回来

问题

我需要修改我的JSON,以便每个文档都包含这个新的JSON对象。我怎么能这样做?

{  
  "title":"xxxx-x-x-xxxx-xxxx",
  "author":"author 1, author 2",
  "url":"https://xxxxx.com",
  "id":xxxxx,
  "_version_":xxxxxx,
  "authors":[
    {
      "name": "author1",
      "id": "143"
    },
    {
      "name": "author2",
      "id": "72"
    }
  ]
}

我的尝试

我尝试了一个更简单的版本,我只有一个作者名称数组

{  
  "title":"xxxx-x-x-xxxx-xxxx",
  "author":"author 1, author 2",
  "url":"https://xxxxx.com",
  "id":xxxxx,
  "_version_":xxxxxx,
  "authors":[
    "author1",
    "author2"
  ]
}

我尝试了以下内容:

$response = $obj['response'];
$docs = $response['docs'];
foreach($docs as &$doc) {
    $author = $doc['author'];
    $authors_array = explode(" ,", $author);
    $doc['authors'] = $authors_array;
}

由于未附加新数组,因此最终失败。

1 个答案:

答案 0 :(得分:2)

分解作者字符串,在每个元素上调用API,创建所有这些结果的数组,然后将其放回到对象中。

我在foreach中使用下面的引用,因此它可以直接修改文档元素。

foreach ($obj['response']['docs'] AS &$doc) {
    $author_names = explode(',', $doc['author']);
    $author_array = array_map('author_api', $author_names);
    $doc['authors'] = $author_array;
}