Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 解析未知深度的嵌套数组_Php_Json - Fatal编程技术网

Php 解析未知深度的嵌套数组

Php 解析未知深度的嵌套数组,php,json,Php,Json,我从第三方获得的json文件具有不同深度的键:值对,如下所示: ***编辑JSON以澄清将在mysql数据库中使用的表名。键是表中的列,值是数据。从json到json,列名将是静态的 { "Key1": "Value1", //non-nested key:value go to default table "Key2": "Value2",

我从第三方获得的json文件具有不同深度的键:值对,如下所示: ***编辑JSON以澄清将在mysql数据库中使用的表名。键是表中的列,值是数据。从json到json,列名将是静态的

   {                         
   "Key1": "Value1",  //non-nested key:value go to default table                     
   "Key2": "Value2",                      
   "Key3": "Value3",                                 
   "Table1": [],                      
   "Table2": [{                      
        "Key1": "Value1",                  
        "Key2": "Value2",                  
        "Key3": "Value3"},

        {"Key1": "Value1",                  
         "Key2": "Value2",                  
         "Key3": "Value3"}],

    "Table3": [
          {"Key1": "Value1",                  
            "Key2": "Value2",                  
            "Key3": "Value3"},
             {"Table4": [
                   {"Key1": "Value1",              
                    "Key2": "Value2",              
                    "Key3": "Value3"},
                {"Table5": [
                           {"Key1": "Value1",          
                            "Key2": "Value2",          
                            "Key3": "Value3"}]
                 }]
           }]    
     }
**此示例通过了JSON验证

对于不在嵌套数组中的初始键:值对,我需要设置表名,将所有非嵌套值插入表中。对于嵌套键:值对,需要将tablename设置为数组键,即Array1、Array2、Array3等。其中嵌套键是列名,值是数据

我一直在尝试使用RecursiveIteratorIterator来重申数组,我知道与数组的嵌套foreach处理相比,这有一些速度优势,但不管是哪种方式。。我在分离嵌套数组和提取底层键:Value时遇到问题

我正在尝试这个:

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($data1),
    RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $key=>$value){
        if (!is_array($value)){
        //echo $key." KEY is not an array <br>";
        }

        if(is_array($value)){
            //echo $key." KEY is an array <br>";
                foreach($value as $key1=>$val1){
                    if (is_array($val1)){
                    //echo $key1."KEY 1 is an array<br>";  
                }
            }    
        }
    }    
以下是在JSON数据上运行上述代码时得到的输出:

TableName: project, Key: Key1, Data: Value1 // "project" used for non-nested
TableName: project, Key: Key2, Data: Value2 
TableName: project, Key: Key3, Data: Value3
TableName: 0, Key: Key1, Data: Value1  // Tablename needs to be "Array2"
TableName: 0, Key: Key2, Data: Value2  // for these 3 data sets
TableName: 0, Key: Key3, Data: Value3 
TableName: 1, Key: Key1, Data: Value1  // Tablename needs to be "Array2"
TableName: 1, Key: Key2, Data: Value2 
TableName: 1, Key: Key3, Data: Value3 
TableName: 0, Key: Key1, Data: Value1  // Tablename needs to be "Array3"
TableName: 0, Key: Key2, Data: Value2 
TableName: 0, Key: Key3, Data: Value3  
TableName: 0, Key: Key1, Data: Value1  // Tablename needs to be "Array4"
TableName: 0, Key: Key2, Data: Value2 
TableName: 0, Key: Key3, Data: Value3 
TableName: 0, Key: Key1, Data: Value1  // Tablename needs to be "Array5"
TableName: 0, Key: Key2, Data: Value2 
TableName: 0, Key: Key3, Data: Value3

但是,我需要为数组使用键名,而不是使用数字索引作为表名。也许olibiaz或其他用户对如何实现这一点有一个建议?

在所有评论和交流之后编辑。我将以你为例更准确地说

<?php

$inputJson = '{                         
   "Key1": "Value1",                      
   "Key2": "Value2",                      
   "Key3": "Value3",                                 
   "Table1": [],                      
   "Table2": [{                      
      "Key1": "Value1",                  
      "Key2": "Value2",                  
      "Key3": "Value3"},
     {
        "Key1": "Value1",                  
        "Key2": "Value2",                  
        "Key3": "Value3"}],
   "Table3": [{
        "Key1": "Value1",                  
        "Key2": "Value2",                  
        "Key3": "Value3"},
         {
           "Table4": [{
              "Key1": "Value1",              
              "Key2": "Value2",              
              "Key3": "Value3"},
           {
              "Table5": [{
                 "Key1": "Value1",          
                 "Key2": "Value2",          
                 "Key3": "Value3"}]
             }]
       }]    
 }';
这将显示

TableName:NonNestedTableName,Key:Key1,Data:Value1

TableName:NonNestedTableName,Key:Key2,Data:Value2

TableName:NonNestedTableName,Key:Key3,Data:Value3

TableName:Table2,Key:Key1,Data:Value1

TableName:Table2,Key:Key2,Data:Value2

TableName:Table2,Key:Key3,Data:Value3

TableName:Table2,Key:Key1,Data:Value1

TableName:Table2,Key:Key2,Data:Value2

TableName:Table2,Key:Key3,Data:Value3

TableName:Table3,Key:Key1,Data:Value1

TableName:Table3,Key:Key2,Data:Value2

TableName:Table3,Key:Key3,Data:Value3

TableName:Table4,Key:Key1,Data:Value1

TableName:Table4,Key:Key2,Data:Value2

TableName:Table4,Key:Key3,Data:Value3

TableName:Table5,Key:Key1,Data:Value1

TableName:Table5,Key:Key2,Data:Value2

TableName:Table5,Key:Key3,Data:Value3


在所有评论和交流之后进行编辑。我将以你为例更准确地说

<?php

$inputJson = '{                         
   "Key1": "Value1",                      
   "Key2": "Value2",                      
   "Key3": "Value3",                                 
   "Table1": [],                      
   "Table2": [{                      
      "Key1": "Value1",                  
      "Key2": "Value2",                  
      "Key3": "Value3"},
     {
        "Key1": "Value1",                  
        "Key2": "Value2",                  
        "Key3": "Value3"}],
   "Table3": [{
        "Key1": "Value1",                  
        "Key2": "Value2",                  
        "Key3": "Value3"},
         {
           "Table4": [{
              "Key1": "Value1",              
              "Key2": "Value2",              
              "Key3": "Value3"},
           {
              "Table5": [{
                 "Key1": "Value1",          
                 "Key2": "Value2",          
                 "Key3": "Value3"}]
             }]
       }]    
 }';
这将显示

TableName:NonNestedTableName,Key:Key1,Data:Value1

TableName:NonNestedTableName,Key:Key2,Data:Value2

TableName:NonNestedTableName,Key:Key3,Data:Value3

TableName:Table2,Key:Key1,Data:Value1

TableName:Table2,Key:Key2,Data:Value2

TableName:Table2,Key:Key3,Data:Value3

TableName:Table2,Key:Key1,Data:Value1

TableName:Table2,Key:Key2,Data:Value2

TableName:Table2,Key:Key3,Data:Value3

TableName:Table3,Key:Key1,Data:Value1

TableName:Table3,Key:Key2,Data:Value2

TableName:Table3,Key:Key3,Data:Value3

TableName:Table4,Key:Key1,Data:Value1

TableName:Table4,Key:Key2,Data:Value2

TableName:Table4,Key:Key3,Data:Value3

TableName:Table5,Key:Key1,Data:Value1

TableName:Table5,Key:Key2,Data:Value2

TableName:Table5,Key:Key3,Data:Value3

也许您可以尝试使用json_decode将json字符串转换为数组。它也会处理嵌套的级别

试试看:

也许您可以尝试使用json\u解码将json字符串转换为数组。它也会处理嵌套的级别


试试看:

您的JSON在几个地方缺少逗号,缩进不一致。你能修好它,让我们了解它的结构吗?我能,但这和这个问题有关系吗?我认为要传达的重要信息是,它是嵌套的、未知的深度和初始键:值对不是嵌套数组的一部分,而是数组中的顶级。我知道这个示例不会通过JSON验证,但它只是一个例子。现在它有嵌套的错觉,但实际上Array1、Array2等都是顶级对象的成员。我不确定这是不是有意的。在一个没有为很多结构进行硬编码的算法中,重要的是我们知道哪些结构是可选的或不可选的@Mojtaba-我正在使用json_decode将对象转换为$data1数组,谢谢!JSON在几个地方缺少逗号,缩进不一致。你能修好它,让我们了解它的结构吗?我能,但这和这个问题有关系吗?我认为要传达的重要信息是,它是嵌套的、未知的深度和初始键:值对不是嵌套数组的一部分,而是数组中的顶级。我知道这个例子不会通过JSON验证,但它只是一个例子
嵌套的假象,但实际上Array1、Array2等都是顶级对象的成员。我不确定这是不是有意的。在一个没有为很多结构进行硬编码的算法中,重要的是我们知道哪些结构是可选的或不可选的@Mojtaba-我正在使用json_decode将对象转换为$data1数组,谢谢!非常接近。。。除此之外,使用您的示例,嵌套数组的表名需要是数组键,即level1、level11等,而不是索引号。非常感谢。这有什么不对?key11和key12的表名应该是什么?好的,不太清楚。请确切地告诉我,对于value11和value12,您希望使用什么表名。表名需要设置为数组名,而不是索引,因此对于level1=>[key11=>value11,key12=>value12,表名应该是level1,fieldname1=key11,datafield1=value11;fieldname2=key12,datafield2=value12。实际上level1可能是客户:[姓名:john,地址:123 Main Street]…所以这需要转到Customer表。是的,但是如果你看我的输出,它是cas表名:level1,Key:key11,Data:value11和value12的相同表名。所以这正是你在previius注释中写的非常接近…除了,使用你的示例,嵌套数组的表名需要是数组键,即level1,level11等,而不是索引号。谢谢!这有什么问题?key11和key12的表名应该是什么?好的,不太清楚。请确切地告诉我value11、value12的表名是什么。表名需要设置为数组名,而不是索引,因此level1=>[key11=>value11,key12=>value12,表名应该是level1,fieldname1=key11,datafield1=value11;fieldname2=key12,datafield2=value12。实际上level1可能是客户:[姓名:john,地址:123 Main Street]…所以这需要转到客户表。是的,但如果你看我的输出,它是cas表名:level1,Key:key11,Data:value11和value12的相同表名。这正是你在previius评论中写的。是的,但是一旦你有了数组,你会做什么?这就是这个问题的全部要点!是的,但是一旦你有了e阵列?这就是这个问题的重点!
function toto(array $input, $tableName = '')
{
    foreach ($input as $key => $element) {
        if (is_array($element)) {
            // if key is integer its the first level of array so we keep the $tablename - edited part
            $key = is_int($key) ? $tableName : $key;
            toto($element, $key);
        } else {
            if ($tableName === '') {
                $tableName = 'NonNestedTableName';
            }
            echo "TableName: $tableName, Key: $key, Data: $element \n";
        }
    }
}

$inputArray = json_decode($inputJson, true);

toto($inputArray);