【问题标题】:Combine two json responses and filter by objects合并两个 json 响应并按对象过滤
【发布时间】:2020-06-26 17:25:54
【问题描述】:

我想组合来自 2 个不同端点的两个 json。我的第一个端点返回为 array1

$array1 ='[
    {
        "id": "410",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",        
        "featured": null
    },
    {
        "id": "411",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "featured": null
    },
    {
        "id": "412",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "featured": null
    }
]';

第二个端点返回为array2

    $array2 = '[
    {
        "id": "410",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "contents": "Lorem ipsum sit amet dolor Lorem ipsum sit amet dolor",
        "status": "publish",
        "featured": null
    },
    {
        "id": "411",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "contents": "Lorem ipsum sit amet dolor Lorem ipsum sit amet dolor",
        "status": "draft",
        "featured": null
    },
    {
        "id": "412",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "contents": "Lorem ipsum sit amet dolor Lorem ipsum sit amet dolor",
        "status": "publish",
        "featured": null
    },
    {
        "id": "413",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "contents": "Lorem ipsum sit amet dolor Lorem ipsum sit amet dolor",
        "status": "draft",
        "featured": null
    },
        {
        "id": "414",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "contents": "Lorem ipsum sit amet dolor Lorem ipsum sit amet dolor",
        "status": "draft",
        "featured": null
    }
]';

这2个响应组合成一个数组后,我需要根据状态进行过滤,我下面的php脚本没有按预期返回结果:

$array1 = json_decode($json1, true);
$array2 = json_decode($json2, true);

$status_filter = 'publish';

foreach ($array2 as $value) {
  $id = $value['id'];
  $status = $value['status'];
  $key = array_search($id, array_column($array1, 'id'));
  
  $key2 = array_search($status, array_column($array1, 'status'));
  
  if (isset($array1[$key]) && isset($array1[$key]['description'])) {
    $array1[$key]['contents'] = $value['contents'];
    $array1[$key]['status'] = $status_filter;
  }
  
}

$json1 = json_encode($array1);
$expected = array_filter($array1, function ($status) use ($status_filter) {
    if (strpos($status['status'],$status_filter) !== false){
        return true;
    }

});

foreach ($expected as $k => $v)
    $output[] = (is_string($k) ? ('"' . $k . '":') : '') . json_encode($v);

echo '[' . implode(',', $output) . ']' . PHP_EOL;

回报:

[
    {
        "id": "410",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "status": "publish",        
        "featured": null
    },
    {
        "id": "411",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "status": "publish",
        "featured": null
    },
    {
        "id": "412",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "status": "publish",
        "featured": null
    }
]

我的预期结果需要将$array1$array2 组合起来,然后在id 中与其他status 对象匹配到$array1。最后,我对最终用户的预期回应是:

[
    {
        "id": "410",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "status": "publish",        
        "featured": null
    },
    {
        "id": "412",
        "title": "Title 1",
        "description": "Lorem ipsum sit amet dolor",
        "status": "publish",
        "featured": null
    }
]

我被我的 php 脚本的第一个响应卡住了,这就是为什么 id 411 的 json 仍然返回(在错误的状态值内)。

感谢您的建议

【问题讨论】:

  • 您控制这些端点吗?比如,你能改变他们返回的方式吗?
  • 我只控制第二个端点。 :(
  • 应该没问题。您能否向我们展示您用于生成该端点的代码?
  • 我假设第一个端点对于featuredtitledescription 的值通常不同?
  • 是的,第一个端点总是以null 返回featured,但titledescription 与第二个端点相同。但我需要转换对使用status 使用此api 的用户的响应并仅过滤publish :(

标签: php json


【解决方案1】:

给定示例数组,这将返回预期的输出(加上字段contents)。如果titledescription 等在$array1$array2 中不相等,它将不起作用。

$array1 = json_decode($array1, true);
$array2 = json_decode($array2, true);

$idsToKeep = array_map(function($a) { return $a['id']; }, $array1);

$rowsToKeep = [];

foreach($array2 as $item) {
    if($item['status'] !== 'publish' || !in_array($item['id'], $idsToKeep)) {
        continue;
    }
    $rowsToKeep[] = $item;
}

echo json_encode($rowsToKeep, JSON_PRETTY_PRINT);
echo "\n";

【讨论】:

    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多