создать многомерный массив JSON из JSON в PHP - PullRequest
1 голос
/ 29 мая 2019

У меня есть данные JSON. Теперь я хочу реформировать это. В моих данных json есть свойство, подобное person_on_zone . Я хочу создать свойство с именем person_info и сохранить их, кто из них находится в этой области.

Вот мои данные, любой код. Заранее спасибо

Мои данные JSON

$val = [
    {
     'city':'xx',
     'zone':'yy',
     'person_on_zone':'p1'
    },
    {
     'city':'xx',
     'zone':'yy',
     'person_on_zone':'p2'
    },
    {
     'city':'xx',
     'zone':'yy',
     'person_on_zone':'p3'
    },
    {
     'city':'xx',
     'zone':'ww',
     'person_on_zone':'p1'
    },
  ]

Мои ожидания

[
 {
  'city':'xx',
  'zone':'yy',
  'person_info':{
                  'person_on_zone':'p1',
                  'person_on_zone':'p2',
                  'person_on_zone':'p3',
                }
 },
 {
  'city':'xx',
  'zone':'ww',
  'person_info':{
                  'person_on_zone':'p1'
                }
 },
] 

Здесь я попробовал

foreach ($val as $v) {
    $new_array['city'] = $v['city'];
    $new_array['zone'] = $v['zone'];
    foreach ($val as $v2) {
        $new_array['person_info'] = $v['person_on_zone'];
    }
}
json_encode($new_array);

Ответы [ 5 ]

1 голос
/ 29 мая 2019

Попробуйте, используйте $map для хранения ключа city-zone, затем преобразуйте в массив, чтобы получить результат

<?php

$val = [
    [
        'city' => 'xx',
        'zone' => 'yy',
        'person_on_zone' => 'p1'
    ],
    [
        'city' => 'xx',
        'zone' => 'yy',
        'person_on_zone' => 'p2'
    ],
    [
        'city' => 'xx',
        'zone' => 'yy',
        'person_on_zone' => 'p3'
    ],
    [
        'city' => 'xx',
        'zone' => 'ww',
        'person_on_zone' => 'p1'
    ]
];

$map = [];
foreach ($val as $v) {
    $key = $v['city'] . $v['zone'];
    if (!isset($map[$key])) {
        $map[$key] = [
            'city' => $v['city'],
            'zone' => $v['zone'],
            'person_info' => []
        ];
    }

    $map[$key]['person_info'][] = $v['person_on_zone'];
}

print_r(array_values($map));
0 голосов
/ 29 мая 2019

Один простой foreach будет делать,

$result = [];
foreach ($arr as $key => $value) {
    //created unique combination of city and zone as key
    $result[$value['city'] . $value['zone']]['city']          = $value['city'];
    $result[$value['city'] . $value['zone']]['zone']          = $value['zone'];
    $result[$value['city'] . $value['zone']]['person_info'][] = ['person_on_zone' => $value['person_on_zone']];
}
echo json_encode(array_values($result));die;

array_values ​​ - вернуть все значения массива

Рабочая демонстрация .

0 голосов
/ 29 мая 2019

Я думаю, что вы делаете ошибку, сочиняя JSON.Я попытался с вашим кодом, и я нашел следующее правильный способ сделать это. Помните, что одинарная кавычка (') недопустима в строке json, которая используется для определения пары ключ-значение в php

<code>// I think your code has json string and i convert it into array of objects(stdClass) 
// and if your code has array then keep you code intact but need to change the notation of 
// objects to associative array.

// first thing first decode json string
$values =  json_decode('[
{ "city":"xx",
  "zone":"yy",
  "person_on_zone":"p1"
},
{
 "city":"xx",
 "zone":"yy",
 "person_on_zone":"p2"
},
{
 "city":"xx",
 "zone":"yy",
 "person_on_zone":"p3"
},
{
 "city":"xx",
 "zone":"ww",
 "person_on_zone":"p1"
}]');

// Now declare new values as array
$new_values = [];
// walk through each object
foreach ($values as $v){
    // $v becomes an object of stdClass here
    // $data is a temporary array
    $data['city'] = $v->city;
    $data['zone'] = $v->zone;
    $data['person_info'] = [];
    foreach ($values as $v2){
        if(!in_array($data['person_info'],['person_on_zone' => $v2->person_on_zone]))
        {
            // compare if zones are same or not
            if($v->zone == $v2->zone)
            {
                // push to the array instead of assiging
                array_push($data['person_info'], ['person_on_zone' => $v2->person_on_zone]);
            }
        }

    }
    // make array unique 
    $data['person_info'] = array_map("unserialize", array_unique(array_map("serialize", $data['person_info'])));
    array_push($new_values, $data);
}
// make array unique in mutidimensional array
$new_values = array_map("unserialize", array_unique(array_map("serialize", $new_values)));
echo '<pre>';
print_r($new_values);
echo '
';
0 голосов
/ 29 мая 2019

попробуйте это:

сначала декодируйте массив json, затем используйте цикл foreach с ключом

$val = json_decode($val);
foreach ($val as $v){
         $new_array['city'] = $v->city;
         $new_array['zone'] = $v->zone;
         foreach ($val as $key=>$v2){
         $new_array[$key]['person_info'] = $v->person_on_zone;
                    }
                }
 print_r($new_array);
0 голосов
/ 29 мая 2019

Правильный код

  foreach ($val as $v){
                    $new_array['city'] = $v['city'];
                    $new_array['zone'] = $v['zone'];
                    foreach ($val as $v2){
                        $new_array['person_info'] = $v2['person_on_zone'];
                    }
                }
                json_encode($new_array);
...