【问题标题】:Arrange JSON data saving duplicates into one row将保存重复项的 JSON 数据排列成一行
【发布时间】:2017-04-06 13:42:57
【问题描述】:

大家早上好!

我很难弄清楚如何安排以下 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"
   }]
}

进入这个:

{
   "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"
   }]
}

基本上,将相同的度数放在一个位置,并用逗号分隔所述度数的所有名称

我已经将此 JSON 解码为变量:

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

提前感谢您的帮助!

【问题讨论】:

  • 你为什么要这样做
  • 那个 JSON 无效..

标签: php arrays json sorting


【解决方案1】:

我想出了这个

$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"}]}

您想要的 json 输出无效,我已在其位置创建了一个数组结构。如果您想要逗号分隔的文本,只需使用我已注释掉的连接语句即可。

【讨论】:

  • 这很好用@glaux,非常感谢!
【解决方案2】:
$str = '{
   "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"
   }]
}';
$str_arr = json_decode($str);
foreach($str_arr->degrees as $k=>$val){
    if($val->degree == 'Bachelor\'s Degree'){
        $new['Bachelor'][] = $val;
    }else{
        $new[] = $val;
    }
}

foreach($new['Bachelor'] as $aa){
    $nameStr[]= $aa->Name;
    $numStr[] = $aa->Number;
}
$nameStr = implode(', ', $nameStr);
$numStr = implode(', ', $numStr);
$degree = 'Bachelor\'s Degree';
$new[] =  (object) array($nameStr, $numStr, $degree);
unset($new['Bachelor']);

echo $json = json_encode($new);
echo "<pre>"; print_r(json_decode($json)); 

希望这会有所帮助。

Demo here

【讨论】:

    【解决方案3】:

    应该这样做:

    <?php
    $json = '{
    "showElement": "1",
    "degrees": [{
        "Name": "Bachelor in Psychology",
        "Number": "53",
        "degree": "Bachelors Degree"
    }, {
        "Name": "Certificate",
        "Number": "56",
        "degree": "Certificate"
    }, {
        "Name": "High School Diploma",
        "Number": "28",
        "degree": "High School"
    }, {
        "Name": "Bachelor in Sociology",
        "Number": "109",
        "degree": "Bachelors Degree"
    }]
    }';
    
    $items = json_decode($json, true);
    $orderedItems = [];
    $final = ['showElement' => 1];
    foreach ($items['degrees'] as $item) {
        $orderedItems[$item['degree']]['Name'][] = $item['Name'];
        $orderedItems[$item['degree']]['Number'][] = $item['Number'];
        $orderedItems[$item['degree']]['degree'] = $item['degree'];
    }
    
    foreach ($orderedItems as $order) {
        $order['Name'] = (count($order['Name']) > 1) ? $order['Name'] : $order['Name'][0];
        $order['Number'] = (count($order['Number']) > 1) ? $order['Number'] : $order['Number'][0];
        $final['degrees'][] = [
            'Name' => $order['Name'],
            'Number' => $order['Number'],
            'degree' => $order['degree']
        ];
    }
    
    echo json_encode($final);
    

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 2018-09-17
      • 2022-10-12
      • 2019-07-29
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      相关资源
      最近更新 更多