doujiu8178 2017-04-06 13:42
浏览 97
已采纳

安排JSON数据将重复项保存到一行

Good morning guys!

I'm having a hard time trying to figure out how to arrange the following JSON:

{
   "showElement": "1",
   "degrees": [{
       "Name": "Bachelor in Psychology",
       "Number": "53",
       "degree": "Bachelor's Degree"
   }, {
       "Name": "Certificate",
       "Number": "56",
       "degree": "Certificate"
   }, {
       "Name": "High School Diploma",
       "Number": "28",
       "degree": "High School"
   }, {
       "Name": "Bachelor in Sociology",
       "Number": "109",
       "degree": "Bachelor's Degree"
   }]
}

Into this:

{
   "showElement": "1",
   "degrees": [{
       "Name": "Bachelor in Psychology", "Bachelor in Sociology",
       "Number": "53","109",
       "degree": "Bachelor's Degree"
   }, {
       "Name": "Certificate",
       "Number": "56",
       "degree": "Certificate"
   }, {
       "Name": "High School Diploma",
       "Number": "28",
       "degree": "High School"
   }]
}

Basically, put the same degrees in one place and have all the names of said degree separated by a comma

I already have this JSON decoded into a variable:

$data = json_decode($topDegrees[1]["diplomas"],true);

Thanks in advance for your help!

  • 写回答

3条回答 默认 最新

  • dpgu5074 2017-04-06 14:16
    关注

    I came up with this

    $json = <<<JSON
    {
       "showElement": "1",
       "degrees": [{
           "Name": "Bachelor in Psychology",
           "Number": "53",
           "degree": "Bachelor's Degree"
       }, {
           "Name": "Certificate",
           "Number": "56",
           "degree": "Certificate"
       }, {
           "Name": "High School Diploma",
           "Number": "28",
           "degree": "High School"
       }, {
           "Name": "Bachelor in Sociology",
           "Number": "109",
           "degree": "Bachelor's Degree"
       }]
    }
    JSON;
    
    $data = json_decode( $json, true );
    
    $degrees = $data['degrees'];
    $names = array_column($degrees, 'degree');
    $count = array_count_values($names);
    $duplicates = array_filter($count, function($var) {
      return $var > 1;
    });
    
    
    foreach ( array_flip($duplicates) as $degree ) {
    
      $filter = array_filter($degrees, function($var) use ($degree) {
        return ( $var['degree'] === $degree );
      });
    
      $names = [];
      $numers = [];
      foreach ( $filter as $item ) {
        $names[] = $item['Name'];
        $numbers[] = $item['Number'];
      }
      $indices = array_keys($filter);
      $index = array_shift($indices);
      $degrees[$index]['Name'] = $names; // = join(', ', $names);
      $degrees[$index]['Number'] = $numbers; // = join(', ', $numbers);
    
      while ( count($indices) ) {
        unset($degrees[array_shift($indices)]);
      }
    }
    
    $data['degrees'] = $degrees;
    
    print_r(json_encode($data));
    // {"showElement":"1","degrees":[{"Name":["Bachelor in Psychology","Bachelor in Sociology"],"Number":["53","109"],"degree":"Bachelor's Degree"},{"Name":"Certificate","Number":"56","degree":"Certificate"},{"Name":"High School Diploma","Number":"28","degree":"High School"}]}
    

    Your wanted json output is not valid, i have made an array structure in its place. If you want comma separated text, just use the join statements I've commented out.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件
  • ¥15 不同系统编译兼容问题
  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求
  • ¥20 antv g6 折线边如何变为钝角
  • ¥30 如何在Matlab或Python中 设置饼图的高度
  • ¥15 nginx中的CORS策略应该如何配置
  • ¥30 信号与系统实验:采样定理分析
  • ¥100 我想找人帮我写Python 的股票分析代码,有意请加mathtao