Как решить Array Merge для JSON в этом примере? - PullRequest
0 голосов
/ 05 октября 2018

Я анализирую лист Excel и получаю этот JSON:

[
   {
      "A":"Samsung",
      "Groupe":{
         "F":"TV",
         "D":"HDR"
      }
   },
   {
      "A":null,
      "Groupe":{
         "F":null,
         "D":null
      }
   },
   {
      "A":"Sony",
      "Groupe":{
         "F":"T.V",
         "D":"LCD"
      }
   },
   {
      "A":"Sony",
      "Groupe":{
         "F":"PS4",
         "D":"Pro edition"
      }
   },
   {
      "A":"Sony",
      "Groupe":{
         "F":"Smart Phone",
         "D":"Quad core"
      }
   }
]

Php код:

$data = [];
for ($row = 15; $row <= 25; $row++) {
    $data[] = [
        'A' => $worksheet->getCell('A'.$row)->getValue(),
        'Groupe' => [
            'F' => $worksheet->getCell('F'.$row)->getValue(),
            'D' => $worksheet->getCell('D'.$row)->getValue()
        ]
    ];
} 

Как организовать (отсортировать) json в зависимости от "A"?
Я попробовал это, но все еще не мог объединить "Groupe" для одного и того же "A" вместе:

  1. Убрать пустые колонны.
  2. Создать копию массива.
  3. Перегруппировать поля для того же элемента в новом массиве (это не сработало)

Код:

$data1  = [];
for ($l = 0; $l < count($data); $l++){
    $data1[$l] = $data[$l];
}

for ($j = 0; $j < count($data); $j++) {

    if($data[$j]['A'] != NULL){

        if($data[$j]['A'] !== $data[$j+1]['A']){
            $data1[$j] = $data[$j];
        } 
        else{
            $data1[$j]['A']= $data[$j]['A'];
            $data1[$j]['Groupe']= array_merge($data[$j]['Groupe'], $data[$j+1]['Groupe']);

        }
    }
}

РЕДАКТИРОВАТЬ: Результат, который я получаю для $ data1, точно такой же, как и для входного JSON (за исключением того, что NULL был удален), поэтому похоже, что слияние с массивом не работает, и мне нужно следующее:

    [
       {
          "A":"Samsung",
          "Groupe":{
             "F":"TV",
             "D":"HDR"
          }
       },

       {
          "A":"Sony",
          "Groupe": [{
             "F":"T.V",
             "D":"LCD"
          },{
             "F":"PS4",
             "D":"Pro edition"
          }, {"F":"Smart Phone",
             "D":"Quad core"
          }] 
}]   

Кроме того, он показывает мне следующее:

Примечание: неопределенное смещение: 11 в C: \ xampp \ htdocs \ phptoexcel.php в строке 43 Строка 43: if($data[$j]['A'] !== $data[$j+1]['A']){

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Попробуйте

$arrUnique = array();
$result = array();
$i=0;
foreach($data as $value){
 if($value['A']!=null){
    $data1  = [];
    $intID = $value['A'];
    if( in_array( $intID, $arrUnique ) ) {
        $key = array_search ($intID, $arrUnique);
        $result[$key]['Groupe'][] = $value['Groupe'];

    }else{
        $data1['A'] = $value['A'];
        $data1['Groupe'][] = $value['Groupe'];
        $result[$i]=$data1;
        $arrUnique[]=$value['A'];
        $i++;
    }
}

}

0 голосов
/ 05 октября 2018

Я обычно не выполняю преобразование JSON в JSON, используя PHP, но использую jq командную строку * утилиту .

Учитывая ваш входной файл JSON, вы можете использовать этот фильтр jq:

jq '[[sort_by(.A)|.[]|select(.A!=null)]|group_by(.A)|.[]as $i|{A:$i[].A,Groupe:$i|map(.Groupe)}]|unique' file
[
  {
    "A": "Samsung",
    "Groupe": [
      {
        "F": "TV",
        "D": "HDR"
      }
    ]
  },
  {
    "A": "Sony",
    "Groupe": [
      {
        "F": "T.V",
        "D": "LCD"
      },
      {
        "F": "PS4",
        "D": "Pro edition"
      },
      {
        "F": "Smart Phone",
        "D": "Quad core"
      }
    ]
  }
]
0 голосов
/ 05 октября 2018

Используйте значение A в качестве ключа для $data, так что вы можете сгруппировать по нему:

$data = [];
for ($row = 15; $row <= 25; $row++) {
    //get A value, skip if A = NULL
    $a = $worksheet->getCell('A'.$row)->getValue(),
    if($a===NULL)continue;

    //get F and D VALUE, skip if one of them = NULL
    $f = $worksheet->getCell('F'.$row)->getValue();
    $d = $worksheet->getCell('D'.$row)->getValue();
    if($f===null || $d===null)continue;

    //test if A is a key in $data. If not, create
    if(!array_key_exist( $a, $data ){
          $data[$a]=[
             'A'=>$a,
             'Groupe'=>[]
             ];
           }

    //Put F and D in a new array in Groupe
    $data[$a]['Groupe'][]=["F"=>$f,"D"=>$d];
} 

В итоге вы получите:

$data=>     
[ "Samsung" =>[ "A" => "Samsung",
                "Groupe" => [ 0 =>[ "F" => "TV",
                                    "D" => "HDR"
                                  ]
                            ]
              ],
  "Sony" =>  [ "A" => "Sony",
               "Groupe" => [ 0 =>[ "F":"TV",
                                   "D":"HDR"
                                 ],
                             1 =>[ "F":"T.V",
                                   "D":"LCD"
                                 ],
                             2 =>[ "F":"PS4",
                                   "D":"Pro edition"
                                 ],
                             3 =>[ "F":"Smart Phone",
                                   "D":"Quad core"
                                 ],

            ]
]
...