【问题标题】:create multidimensional json array from a json in php从 php 中的 json 创建多维 json 数组
【发布时间】:2019-10-14 14:32:40
【问题描述】:

我有一个 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);

【问题讨论】:

  • 我认为你必须像这样改变内部循环 foreach ($val as $v2){ $new_array['person_info'] = $v2['person_on_zone']; }
  • 感谢您的反馈,能否更正此代码?
  • 是 $val json 字符串
  • 一个键不能多次使用。

标签: php arrays json multidimensional-array


【解决方案1】:

一个简单的 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 — 返回数组的所有值

Working demo.

【讨论】:

    【解决方案2】:

    我认为你在编写 json 时犯了一个错误。我尝试使用您的代码,发现以下是正确的方法。记住单引号(')在用于在 php 中定义键值对的 json 字符串中无效

    // 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 '</pre>';
    

    【讨论】:

      【解决方案3】:

      试试这个:

      首先解码 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);
      

      【讨论】:

        【解决方案4】:

        正确的代码

          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);
        

        【讨论】:

          【解决方案5】:

          试试这个,用$map存储keycity-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':'p1' 。我需要'person_on_zone':'p1'。请
          • 不能在person_info @mrmithun 中使用重复键person_on_zone
          猜你喜欢
          • 2017-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-28
          • 2014-02-01
          • 2017-06-18
          • 1970-01-01
          • 2022-01-19
          相关资源
          最近更新 更多