【问题标题】:Json Nested arrays to single array using php使用php将Json嵌套数组到单个数组
【发布时间】:2018-05-10 11:38:02
【问题描述】:

我有一个嵌套的 JSON。我想在 php 中将其转换为简单的 json

var movies = [{
    "name": "Ice Age 3",
    "place" : "USA",
    "actors" : "cartoon",
    "details": [
        {"language": "English", "year": "2012"}, 
        {"language": "French", "year": "2011"}, 
        {"language": "German", "year": "2013"}
    ],
    "details2": [
        {"language2": "Spanish", "year2": "2015"}, 
        {"language2": "Arabic", "year2": "2016"}, 
        {"language2": "Hindi", "year2": "2017"}
    ]
}];

像这样……

  var movies = [
      {"name":"Ice Age 3","place" : "USA", "actors" : "cartoon", "details.language":"English", "details.year":"2012", "details2.language2":"English", "details2.year2":"2015"},
      {"name":"Ice Age 3","place" : "USA", "actors" : "cartoon", "details.language":"French", "details.year":"2011", "details2.language2":"French", "details2.year2":"2016"},
      {"name":"Ice Age 3","place" : "USA", "actors" : "cartoon", "details.language":"German", "details.year":"2013", "details2.language2":"German", "details2.year2":"2017"}
    ];

当我尝试这种方式时,我得到了一个扁平的 json。

function convert_flatten($array) { 
  if (!is_array($array)) { 
    return FALSE; 
  } 
  $result = array(); 
  foreach ($array as $key => $value) { 
    if (is_array($value)) { 
      $arrayList=convert_flatten($value);
      foreach ($arrayList as $listItem) {
        $result[] = $listItem; 
      }
    } 
   else { 
    $result[$key] = $value; 
   } 
  } 
  return $result; 
} 

这实际上是一个表示 json。我正在寻找一个通用的答案。 任何帮助将不胜感激

谢谢

【问题讨论】:

    标签: php arrays json multidimensional-array


    【解决方案1】:

    类似于 Prashant 的回答...

    $movies = '[{
        "name": "Ice Age 3",
        "details": [
        {"language": "English", "year": "2012"},
        {"language": "French", "year": "2011"},
        {"language": "German", "year": "2013"}
        ]
    }]';
    
    $movies = json_decode($movies, true);
    $out = array();
    foreach ( $movies as $movie )   {
        foreach ( $movie['details'] as $movieDetails ){
            $movieDetails['name'] = $movie['name'];
            $out[] = $movieDetails;
    
        }
    }
    echo json_encode($out);
    

    输出...

    [{"language":"English","year":"2012","name":"Ice Age 3"},
        {"language":"French","year":"2011","name":"Ice Age 3"},
        {"language":"German","year":"2013","name":"Ice Age 3"}]
    

    与其试图将内容作为某种匿名 JSON 进行操作,此代码仅适用于呈现的数据。原始 JSON 中的每个元素一次处理一个(可能允许存在具有相同结构的多部电影),并且仅将每个详细信息数组元素提升到 $out 中的顶层(将电影名称添加到每次都这样)。

    【讨论】:

    • 我认为没有比这更干净的了。
    【解决方案2】:

    试试这个

         $(function () {
                        var movies = [{
                                "name": "Ice Age 3",
                                "details": [
                                    {"language": "English", "year": "2012"},
                                    {"language": "French", "year": "2011"},
                                    {"language": "German", "year": "2013"}
                                ]
                            }];
    
                        var obj = JSON.parse(JSON.stringify(movies));
                        var obj2;
    
                        jsonObj = [];
                        for (var i = 0; i < obj.length; i++) {
    
                            item = {};
                            obj2 = JSON.parse(JSON.stringify(obj[i].details));
                            for (var j = 0; j < obj2.length; j++) {
    
                                item ["name"] = obj[i].name;
                                item ["language"] = obj2[j].language;
                                item ["year"] = obj2[j].year;
    
                                jsonObj.push(item);
                            }
                        }
    
                        var data = JSON.stringify(jsonObj);
    
                        alert(data);
    
                    });
    

    【讨论】:

    • 试试这个答案在 StackOverflow 上的价值很低,因为它们在教育 OP 和成千上万的未来研究人员方面做得很差。请永远不要发布仅代码的答案。请花点时间解释一下您的答案是如何工作的,以及为什么它是一个好的建议。
    【解决方案3】:

    您不需要递归来执行此操作,这是未经测试的,但将为您的需要提供基础;

    function flattenMovies($data)
    {
        // Get the name of the movie
        $name = $data['name'];
        $return_val = array();
        // For each part of this...
        foreach ($data as $part)
        {
            // If it is an array...
            if (is_array($part))
            {
                // Create a new array for this row and add the movie name
                $add_parts = array("name" => $name);
                // For each of the parts parts...
                foreach ($part as $key => $value)
                {
                    // Add this to the row array assoc by key = value
                    $add_parts[$key] = $value;
                }
                // Add the row to the return array
                $return_val[] = $add_parts;
                // Blank this row so we know this does not have any "old" info in
                $add_parts = null;
            }
        }
        // Return the flattened array
        return $return_val;
    }
    

    您需要做的就是遍历数组并将各个部分添加到单个值数组中
    正如我所说,您可能需要在 foreach 中添加另一个嵌套,未经测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2017-10-15
      • 1970-01-01
      • 2021-09-26
      • 2021-07-19
      相关资源
      最近更新 更多