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