Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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将URL响应中的嵌套JSON转换为平面JSON_Php_Arrays_Json - Fatal编程技术网

使用PHP将URL响应中的嵌套JSON转换为平面JSON

使用PHP将URL响应中的嵌套JSON转换为平面JSON,php,arrays,json,Php,Arrays,Json,我试图实现的是动态地直接展平JSON嵌套响应。我从API URL得到的响应是 { "currency" : "USD", "results" : [ { "itineraries" : [ { "outbound" : { "duration" : "17:50", "flights" : [ { "departs_at" : "2018-10-15T08:45", "arrives_at" : "2018-10-15T11:00

我试图实现的是动态地直接展平JSON嵌套响应。我从API URL得到的响应是

 {   "currency" : "USD",   "results" : [ {
 "itineraries" : [ {
   "outbound" : {
     "duration" : "17:50",
     "flights" : [ {
       "departs_at" : "2018-10-15T08:45",
       "arrives_at" : "2018-10-15T11:00",
       "origin" : {
         "airport" : "IST",
         "terminal" : "I"
       },
       "destination" : {
        "airport" : "LHR",
        "terminal" : "5"
      },
      "marketing_airline" : "BA",
      "operating_airline" : "BA",
      "flight_number" : "675",
      "aircraft" : "320",
      "booking_info" : {
        "travel_class" : "ECONOMY",
        "booking_code" : "S",
        "seats_remaining" : 7
      }
    }, {
      "departs_at" : "2018-10-15T16:55",
      "arrives_at" : "2018-10-15T19:35",
      "origin" : {
        "airport" : "LHR",
        "terminal" : "5"
      },
      "destination" : {
        "airport" : "BOS",
        "terminal" : "E"
      },
      "marketing_airline" : "BA",
      "operating_airline" : "BA",
      "flight_number" : "203",
      "aircraft" : "777",
      "booking_info" : {
        "travel_class" : "ECONOMY",
        "booking_code" : "N",
        "seats_remaining" : 9
      }
    } ]
  },
  "inbound" : {
    "duration" : "14:00",
    "flights" : [ {
      "departs_at" : "2018-10-21T19:25",
      "arrives_at" : "2018-10-22T07:00",
      "origin" : {
        "airport" : "BOS",
        "terminal" : "E"
      },
      "destination" : {
        "airport" : "LHR",
        "terminal" : "5"
      },
      "marketing_airline" : "BA",
      "operating_airline" : "BA",
      "flight_number" : "212",
      "aircraft" : "388",
      "booking_info" : {
        "travel_class" : "ECONOMY",
        "booking_code" : "N",
        "seats_remaining" : 9
      }
    }, {
      "departs_at" : "2018-10-22T10:25",
      "arrives_at" : "2018-10-22T16:25",
      "origin" : {
        "airport" : "LHR",
        "terminal" : "5"
      },
      "destination" : {
        "airport" : "IST",
        "terminal" : "I"
      },
      "marketing_airline" : "BA",
      "operating_airline" : "BA",
      "flight_number" : "676",
      "aircraft" : "320",
      "booking_info" : {
        "travel_class" : "ECONOMY",
        "booking_code" : "S",
        "seats_remaining" : 9
      }
    } ]
  }
} ],
"fare" : {
  "total_price" : "486.17",
  "price_per_adult" : {
    "total_fare" : "486.17",
    "tax" : "343.17"
  },
  "restrictions" : {
    "refundable" : false,
    "change_penalties" : true
  }
}   }, {
"itineraries" : [ {
  "outbound" : {
    "duration" : "10:55",
    "flights" : [ {
      "departs_at" : "2018-10-15T14:35",
      "arrives_at" : "2018-10-15T18:30",
      "origin" : {
        "airport" : "IST",
        "terminal" : "I"
      },
      "destination" : {
        "airport" : "BOS",
        "terminal" : "E"
      },
      "marketing_airline" : "TK",
      "operating_airline" : "TK",
      "flight_number" : "81",
      "aircraft" : "333",
      "booking_info" : {
        "travel_class" : "ECONOMY",
        "booking_code" : "W",
        "seats_remaining" : 9
      }
    } ]
  },
  "inbound" : {
    "duration" : "09:35",
    "flights" : [ {
      "departs_at" : "2018-10-21T23:35",
      "arrives_at" : "2018-10-22T16:10",
      "origin" : {
        "airport" : "BOS",
        "terminal" : "E"
      },
      "destination" : {
        "airport" : "IST",
        "terminal" : "I"
      },
      "marketing_airline" : "TK",
      "operating_airline" : "TK",
      "flight_number" : "82",
      "aircraft" : "333",
      "booking_info" : {
        "travel_class" : "ECONOMY",
        "booking_code" : "W",
        "seats_remaining" : 9
      }
    } ]
  }
} ],
"fare" : {
  "total_price" : "528.31",
  "price_per_adult" : {
    "total_fare" : "528.31",
    "tax" : "344.31"
  },
  "restrictions" : {
    "refundable" : false,
    "change_penalties" : true
  }
}   } ] }
我基本上需要的是以一种简单的方式格式化它,这样所有的东西都在同一个层次上

我得到的响应文件是这样的 $json_url=file_get_contents('https://domain/api'); 如果我打印它,它工作得很好,但是很难将结果简化为一个简单的JSON响应

编辑 差不多

 {
    "currency": "USD",
    "results[0].itineraries[0].outbound.duration": "17:50",
    "results[0].itineraries[0].outbound.flights[0].departs_at": "2018-10-15T08:45",
    "results[0].itineraries[0].outbound.flights[0].arrives_at": "2018-10-15T11:00",
    "results[0].itineraries[0].outbound.flights[0].origin.airport": "IST",
    "results[0].itineraries[0].outbound.flights[0].origin.terminal": "I",
    "results[0].itineraries[0].outbound.flights[0].destination.airport": "LHR",
    "results[0].itineraries[0].outbound.flights[0].destination.terminal": "5",
    "results[0].itineraries[0].outbound.flights[0].marketing_airline": "BA",
    "results[0].itineraries[0].outbound.flights[0].operating_airline": "BA",
    "results[0].itineraries[0].outbound.flights[0].flight_number": "675",
    "results[0].itineraries[0].outbound.flights[0].aircraft": "320",
    "results[0].itineraries[0].outbound.flights[0].booking_info.travel_class": "ECONOMY",
    "results[0].itineraries[0].outbound.flights[0].booking_info.booking_code": "S",
    "results[0].itineraries[0].outbound.flights[0].booking_info.seats_remaining": 7,
    "results[0].itineraries[0].outbound.flights[1].departs_at": "2018-10-15T16:55",
    "results[0].itineraries[0].outbound.flights[1].arrives_at": "2018-10-15T19:35",
    "results[0].itineraries[0].outbound.flights[1].origin.airport": "LHR",
    "results[0].itineraries[0].outbound.flights[1].origin.terminal": "5",
    "results[0].itineraries[0].outbound.flights[1].destination.airport": "BOS",
    "results[0].itineraries[0].outbound.flights[1].destination.terminal": "E",
    "results[0].itineraries[0].outbound.flights[1].marketing_airline": "BA",
    "results[0].itineraries[0].outbound.flights[1].operating_airline": "BA",
    "results[0].itineraries[0].outbound.flights[1].flight_number": "203",
    "results[0].itineraries[0].outbound.flights[1].aircraft": "777",
    "results[0].itineraries[0].outbound.flights[1].booking_info.travel_class": "ECONOMY",
    "results[0].itineraries[0].outbound.flights[1].booking_info.booking_code": "N",
    "results[0].itineraries[0].outbound.flights[1].booking_info.seats_remaining": 9,
    "results[0].itineraries[0].inbound.duration": "14:00",
    "results[0].itineraries[0].inbound.flights[0].departs_at": "2018-10-21T19:25",
    "results[0].itineraries[0].inbound.flights[0].arrives_at": "2018-10-22T07:00",
    "results[0].itineraries[0].inbound.flights[0].origin.airport": "BOS",
    "results[0].itineraries[0].inbound.flights[0].origin.terminal": "E",
    "results[0].itineraries[0].inbound.flights[0].destination.airport": "LHR",
    "results[0].itineraries[0].inbound.flights[0].destination.terminal": "5",
    "results[0].itineraries[0].inbound.flights[0].marketing_airline": "BA",
    "results[0].itineraries[0].inbound.flights[0].operating_airline": "BA",
    "results[0].itineraries[0].inbound.flights[0].flight_number": "212",
    "results[0].itineraries[0].inbound.flights[0].aircraft": "388",
    "results[0].itineraries[0].inbound.flights[0].booking_info.travel_class": "ECONOMY",
    "results[0].itineraries[0].inbound.flights[0].booking_info.booking_code": "N",
    "results[0].itineraries[0].inbound.flights[0].booking_info.seats_remaining": 9,
    "results[0].itineraries[0].inbound.flights[1].departs_at": "2018-10-22T10:25",
    "results[0].itineraries[0].inbound.flights[1].arrives_at": "2018-10-22T16:25",
    "results[0].itineraries[0].inbound.flights[1].origin.airport": "LHR",
    "results[0].itineraries[0].inbound.flights[1].origin.terminal": "5",
    "results[0].itineraries[0].inbound.flights[1].destination.airport": "IST",
    "results[0].itineraries[0].inbound.flights[1].destination.terminal": "I",
    "results[0].itineraries[0].inbound.flights[1].marketing_airline": "BA",
    "results[0].itineraries[0].inbound.flights[1].operating_airline": "BA",
    "results[0].itineraries[0].inbound.flights[1].flight_number": "676",
    "results[0].itineraries[0].inbound.flights[1].aircraft": "320",
    "results[0].itineraries[0].inbound.flights[1].booking_info.travel_class": "ECONOMY",
    "results[0].itineraries[0].inbound.flights[1].booking_info.booking_code": "S",
    "results[0].itineraries[0].inbound.flights[1].booking_info.seats_remaining": 9,
    "results[0].fare.total_price": "486.17",
    "results[0].fare.price_per_adult.total_fare": "486.17",
    "results[0].fare.price_per_adult.tax": "343.17",
    "results[0].fare.restrictions.refundable": false,
    "results[0].fare.restrictions.change_penalties": true
    }
    {
    "currency": "USD",
    "results[1].itineraries[0].outbound.duration": "10:55",
    "results[1].itineraries[0].outbound.flights[0].departs_at": "2018-10-15T14:35",
    "results[1].itineraries[0].outbound.flights[0].arrives_at": "2018-10-15T18:30",
    "results[1].itineraries[0].outbound.flights[0].origin.airport": "IST",
    "results[1].itineraries[0].outbound.flights[0].origin.terminal": "I",
    "results[1].itineraries[0].outbound.flights[0].destination.airport": "BOS",
    "results[1].itineraries[0].outbound.flights[0].destination.terminal": "E",
    "results[1].itineraries[0].outbound.flights[0].marketing_airline": "TK",
    "results[1].itineraries[0].outbound.flights[0].operating_airline": "TK",
    "results[1].itineraries[0].outbound.flights[0].flight_number": "81",
    "results[1].itineraries[0].outbound.flights[0].aircraft": "333",
    "results[1].itineraries[0].outbound.flights[0].booking_info.travel_class": "ECONOMY",
    "results[1].itineraries[0].outbound.flights[0].booking_info.booking_code": "W",
    "results[1].itineraries[0].outbound.flights[0].booking_info.seats_remaining": 9,
    "results[1].itineraries[0].inbound.duration": "09:35",
    "results[1].itineraries[0].inbound.flights[0].departs_at": "2018-10-21T23:35",
    "results[1].itineraries[0].inbound.flights[0].arrives_at": "2018-10-22T16:10",
    "results[1].itineraries[0].inbound.flights[0].origin.airport": "BOS",
    "results[1].itineraries[0].inbound.flights[0].origin.terminal": "E",
    "results[1].itineraries[0].inbound.flights[0].destination.airport": "IST",
    "results[1].itineraries[0].inbound.flights[0].destination.terminal": "I",
    "results[1].itineraries[0].inbound.flights[0].marketing_airline": "TK",
    "results[1].itineraries[0].inbound.flights[0].operating_airline": "TK",
    "results[1].itineraries[0].inbound.flights[0].flight_number": "82",
    "results[1].itineraries[0].inbound.flights[0].aircraft": "333",
    "results[1].itineraries[0].inbound.flights[0].booking_info.travel_class": "ECONOMY",
    "results[1].itineraries[0].inbound.flights[0].booking_info.booking_code": "W",
    "results[1].itineraries[0].inbound.flights[0].booking_info.seats_remaining": 9,
    "results[1].fare.total_price": "528.31",
    "results[1].fare.price_per_adult.total_fare": "528.31",
    "results[1].fare.price_per_adult.tax": "344.31",
    "results[1].fare.restrictions.refundable": false,
    "results[1].fare.restrictions.change_penalties": true
}

谢谢

这里有一个复制您期望的json格式的方法。
我从中借用了一些代码,并稍微做了一些调整,以使其为您工作,请记住对其进行升级表决

我使用注释中的代码创建数组的货币部分。
然后我将每个新的子数组部分传递给代码,该代码将回溯路径并使其成为json代码

$arr = json_decode($str,true);  // $str is the json
foreach($arr['results'] as $key => $res){
    $new[$key]['currency'] = $arr['currency'];
    $new[$key]['results'][] = $res;
}
foreach($new as $n){
    $json[] = listArrayRecursive($n);
}
$jsonNew = "[" . implode(",", $json) . "]"; // this is the new json formed as you want it
var_dump(json_decode($jsonNew), true); // for debug purpose test it




function listArrayRecursive($someArray) {
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($someArray), RecursiveIteratorIterator::SELF_FIRST);
    $str = "{";
    foreach ($iterator as $k => $v) {

        // Not at end: show key only
        if ($iterator->hasChildren()) {

        } else {
            for ($p = array(), $i = 0, $z = $iterator->getDepth(); $i <= $z; $i++) {
                $p[] = $iterator->getSubIterator($i)->key();
            }
            $path = implode('.', $p);
            $str .= '"' . $path . '": "' .$v . '"' . ",";
        }
    }
    $str = substr($str,0,-1); // remove trailing comma that makes json invalid
    $str .= "}\n";
    return $str;
}
$arr=json_decode($str,true);//$str是json
foreach($arr['results']作为$key=>$res){
$new[$key]['currency']=$arr['currency'];
$new[$key]['results'][]=$res;
}
foreach($n新币){
$json[]=listArrayRecursive($n);
}
$jsonNew=“[”.内爆(“,”,$json)。“]”;//这是您想要的新json格式
var_dump(json_decode($jsonNew),true);//出于调试目的,请测试它
函数listArrayRecursive($someArray){
$iterator=new recursiveiterator(new RecursiveArrayIterator($someArray),recursiveiterator::SELF_FIRST);
$str=“{”;
foreach($k=>v的迭代器){
//不在末尾:仅显示关键点
如果($iterator->hasChildren()){
}否则{
对于($p=array(),$i=0,$z=$iterator->getDepth();$i getSubIterator($i)->key();
}
$path=内爆('.',$p);
$str.='''.$path'.'':“'.$v'.'.'”,“;
}
}
$str=substr($str,0,-1);//删除使json无效的尾部逗号
$str.=“}\n”;
返回$str;
}

这是不可能的,如果你将Json/数组展平,你将如何访问例如“departies\u at”?以及哪个“departies\u at”它是否会回复?是否要将其转换为一维数组?@Andreas是的,也就是说,重复的键将被覆盖。我不明白您尝试这样做的原因或原因。您的原始问题无法回答,因此要么问题应该关闭,要么您应该将其编辑为可以的状态answered@Andreas操作要将键的值浓缩为键,然后将此值分配给长键。
results[0]。investures[0]。outbound.duration
作为键,
17:50
value。这看起来已经很好了。只需一件事。有没有办法删除数组(2){[0]=>object(stdClass)#1(60)并直接从{[“currency”]=>string(3)“USD”开始我的意思是输出像[{},{}]不是这样吗?或者你又在要求一个平面数组,其中有同名的键?它不起作用!相信我。如果你看这个:每个$json元素都是
{}
,它们用逗号内爆。
{},{}
然后连接使它成为
[{},{}]
为什么要在那里进行Json编码?这有什么意义?很明显,数组之间没有逗号,因为代码稍后会用逗号内爆。在数组中添加逗号只会让事情变得更困难。