将两个json数组合并为一个
Posted
技术标签:
【中文标题】将两个json数组合并为一个【英文标题】:Merge two json array into one 【发布时间】:2019-08-30 01:33:28 【问题描述】:尝试将两个 JSON 响应合并为一个,但问题是数据显示在两个数组中,我希望它在一个数组中。我如何在 Lumen/Laravel 中实现它
尝试污染两个数组或响应
public function index(Request $request)
$post = Post::orderBy('id', 'DESC')->get();
$post_images = PostImage::orderBy('id', 'DESC')->get();
return $this->successResponse($posts.$post_image );
预期:-
"post":
"id": 14,
"post_id": 798965728,
"user_id": 1,
"location": "first",
"title": "un8852",
"cooked_time": "1554329910",
"dispose_time": "1554373110",
"food_type": "nv",
"description": "asdfg",
"serve_quantity": 23,
"lat": 19.08,
"lon": 73,
"id": 10,
"post_id": 798965728,
"image_name1": null,
"image_name2": null,
"image_name3": null,
"image_name4": null,
"image_name5": null,
,
"st": "1",
"msg": "success"
得到:-
"post":"\"id\":14,\"post_id\":798965728,\"user_id\":1,\"location\":\"first\",\"title\":\"un8852\",\"cooked_time\":\"1554329910\",\"dispose_time\":\"1554373110\",\"food_type\":\"nv\",\"description\":\"asdfg\",\"serve_quantity\":23,\"lat\":19.08,\"lon\":73,\"created_at\":\"2019-04-04 10:20:18\",\"updated_at\":\"2019-04-04 10:20:18\"\"id\":10,\"post_id\":798965728,\"image_name1\":null,\"image_name2\":null,\"image_name3\":null,\"image_name4\":null,\"image_name5\":null,\"created_at\":\"2019-04-04 10:20:18\",\"updated_at\":\"2019-04-04 10:20:18\"",
"st":"1",
"msg":"success"
【问题讨论】:
如果您包含源数据可能会有所帮助,我们有预期结果,实际结果,但不是[源数据] - 这很好......有点重要。 我可以告诉你,你会很想在json_decoding
之后使用array_replace_recursive($primary, $secondary)
。 PS prolly 不是一个词,但我喜欢它。好的..原来是oxforddictionaries :-(
@ArtisticPhoenix 你能帮我解决这种问题吗***.com/questions/55593703/…
不幸的是我还没有使用 Laravel,我实际上正处于使用它完成项目的计划阶段,但我们将它最初外包,因为我太忙于其他事物。但我计划稍后在它的基础上进行构建,基本上它是我们传入数据的 CRUD 系统,这应该很容易做到。然后后来我种植在它上面。目前我们主要使用 Code Igniter 2,它是我大约 5 年前构建并继续改进的。
【参考方案1】:
那里有一些缺失的部分,但我想我明白发生了什么。
根据您得到的结果,这段代码中的$posts
和$post_image
看起来是雄辩的模型。
return $this->successResponse($posts.$post_image );
当您连接它们时,它们的__toString()
方法将它们转换为字符串,这是使用toJson()
方法完成的。所以基本上你有两个 JSON 对象粘在一起,这不是有效的 JSON,然后successResponse()
方法再次对它们进行编码。
要合并它们,您可以将它们转换为数组,合并它们,然后将结果传递给successResponse()
。
$merged = array_merge($posts->toArray(), $post_image->toArray());
return $this->successResponse($merged);
但是,您想要的结果是不可能的。 “post”对象有两个不同的“id”值。你只能得到一个。如果你使用
$merged = array_merge($posts->toArray(), $post_image->toArray());
那么第二个对象的 id 值将替换第一个。如果要保留第一个 id 值,需要使用 union 而不是array_merge
。
$merged = $a->toArray() + $b->toArray();
【讨论】:
请帮我解决这个问题***.com/questions/55593703/…【参考方案2】:您绝对可以连接两个 JSON 数组,您必须解析对象并将它们连接起来并重新字符串化。
这个问题也可以在这里回答。 https://***.com/a/10384890/1684254
【讨论】:
***.com/questions/55593703/…【参考方案3】:我认为您不能将 2 个 JSON 对象连接为字符串。
正确的方法是:
获取 Post 和 PostImage 对象
$post = Post::orderBy('id', 'DESC')->get();
$post_images = PostImage::orderBy('id', 'DESC')->get();
序列化 Post 对象 https://laravel.com/docs/5.8/eloquent-serialization
使用下面介绍的方法将 PostImage 对象 (image_name1 .. image_name5) 的每个字段添加到 JSON How to add attribute in JSON in php?
返回 JSON
更新:
Post::orderBy('id','DESC')->get()-> first() 返回一个对象。
Post::orderBy('id','DESC')->get() 返回一个对象集合,它需要不同的方法。
试试这个:
$post = Post::orderBy('id', 'DESC')->get();
$post->map(function ($item, $key)
$post_images = PostImage::where('post_id', $item->id)->get()->first();
$item->setAttribute('image_name1',$post_images->image_name1);
$item->setAttribute('image_name2',$post_images->image_name2);
$item->setAttribute('image_name3',$post_images->image_name3);
$item->setAttribute('image_name4',$post_images->image_name4);
$item->setAttribute('image_name5',$post_images->image_name5);
return $item;
);
return $this->successResponse($posts);
【讨论】:
但如果我尝试 $post = Post::orderBy('id','DESC')->get()-> first() 值,它工作正常,但当我删除时,它不是全部first() 函数。它指定集合中不存在 image_name1 我更新了答案。如果这对您不起作用,请更详细地说明您想要做什么。 你能看看这个***.com/questions/55593703/…以上是关于将两个json数组合并为一个的主要内容,如果未能解决你的问题,请参考以下文章