【问题标题】:Json array to object multidimensionalJson数组到对象多维
【发布时间】: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的所有文件:

$dataArray = []; foreach ($array as $key => $value) { $dataArray['dataInfo'][] = [ 'title' => $value['title'], '文件' => [ 'name' => $value['files']['name'], 'url' => $value['files']['url'] ] ]; }

然后我将其转换为 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 不支持这个。

标签: php arrays json laravel


【解决方案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"] 转换为一个集合,然后按“标题”对其进行分组。然后将每个组转换为带有标题和文件数组的条目。

【讨论】:

  • 哦,这很甜蜜,很好的电话
  • 这个是为我做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2015-11-23
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多