Json数组到对象多维
Posted
技术标签:
【中文标题】Json数组到对象多维【英文标题】:Json array to object multidimensional 【发布时间】:2018-12-18 05:14:49 【问题描述】:目前的问题是我的 JSON 中有一个数组,在我解码后。
我从数据库中收集了一些项目,并将它们放在一个 foreach 中的数组中。
要放入数组的数据:
[ 0 => [ 0 => [ '标题' => '标题 1', '文件' => [ '名称' => '文件名', 'url' => 'file_url' ] ] ], [ 1 => [ '标题' => '标题 1', '文件' => [ '名称' => '文件名', 'url' => 'file_url' ] ] ], [ 2 => [ '标题' => '标题 3', '文件' => [ '名称' => '文件名', 'url' => 'file_url' ] ] ], [ 3 => [ '标题' => '标题 4', '文件' => [ '名称' => '文件名', 'url' => 'file_url' ] ] ] ]接下来我将它放在一个数组中以放置属于同一title
的所有文件:
然后我将其转换为 JSON:
json_encode(dataArray);
结果是:
“数据信息”:[ "title": "标题 1", “文件”: "name": "文件名", “url”:“file_url” , "title": "标题 1", “文件”: "name": "文件名", “url”:“file_url” , "title": "标题 3", “文件”: "name": "文件名", “url”:“file_url” , "title": "标题 4", “文件”: "name": "文件名", “url”:“file_url” ]我想要的是:
“数据信息”:[ "title": "标题 1", “文件”: "name": "文件名", "url": "file_url", , "name": "文件名", "url": "file_url", , "title": "标题 3", “文件”: "name": "文件名", “url”:“file_url” , "title": "标题 4", “文件”: "name": "文件名", “url”:“file_url” ]我怎样才能做到这一点?
【问题讨论】:
你不能添加悬空逗号仍然是有效的 JSON,JSON 不支持这个。 【参考方案1】:我猜这应该可行:
$dataArray = [];
$previousTitle = '';
foreach ($array as $key => $value)
if ($previousTitle === $value['title'])
$dataArray['dataInfo'][$previousTitle]['files'] += [
'name' => $value['files']['name'],
'url' => $value['files']['url']
]
else
$dataArray['dataInfo'][] = [
'title' => $value['title'],
'files' => [
'name' => $value['files']['name'],
'url' => $value['files']['url']
]
];
$previousTitle = $value['title'];
【讨论】:
如果标题不按顺序怎么办?假设我们有title1、title2、title1?那么$previousTitle
会起作用吗?
不,不会。您始终可以将 $previousTitle
切换为数组,然后在必要时在 if 语句中进行数组搜索。好电话!【参考方案2】:
Laravel 的集合可以让你这样做:
$result = [ "dataInfo" =>
collect($dataArray["dataInfo"])
->groupBy('title')
->map(function ($group, $title)
return [
"title" => $title,
"files" => $group->pluck("files")->all()
];
)
];
分解:
您首先将$dataArray["dataInfo"]
转换为一个集合,然后按“标题”对其进行分组。然后将每个组转换为带有标题和文件数组的条目。
【讨论】:
哦,这很甜蜜,很好的电话 这个是为我做的。以上是关于Json数组到对象多维的主要内容,如果未能解决你的问题,请参考以下文章