【问题标题】:Not able to parse nested Json array in PHP while print_r function is printing all values properly当 print_r 函数正确打印所有值时,无法解析 PHP 中的嵌套 Json 数组
【发布时间】:2019-02-12 03:48:34
【问题描述】:

我正在尝试解析一个 json 数组字符串。虽然 print_r 正确打印了所有值,但是在获取记录时我失败了。

我一定是做错了什么。请您帮忙改正一下。

这是我的代码

<?
  $str ='
  { 
   "tenant_view_details": [ 
   { 
    "status":"S", 
    "tenant_general":[
    {"tenant_id":"6003","code":"ICI001","type":"BANK","category":"SM","gstn":"IWSDFS7372","pan":"KSAH9876AS","cin":"ASHED456","name":"ICICI Bank","address_line_1":"23, Hertz Plaza, Rajiv Chowk","address_line_2":" ","address_city":"New Delhi","address_distict ":"New Delhi","address_state ":"DL","address_state_code ":"07","address_pin ":"119923","contact_name ":"contact_name","contact_phone ":"1234567890","contact_std_code ":"11","contact_landline ":"1234567890","contact_email_id ":"contact@email.com"} ], 
    "tenant_bank": [ 
    { "bank_name ":"xyz","bank_account_no ":"12345","account_type ":"abc","ifsc_code ":"xx123","address_line_1 ":"qwer","address_line_2         ":"23","address_city ":"abc","address_district ":"xyz","address_state_name ":"asd","address_state_code ":"02","address_pin ":"123456" } ], 
    "tenant_agreement": [ 
    { "category ":"OM","tenancy_type ":"EXT","echarge_type ":"FIX","total_tenancy_value ":"32900.00","energy_charge_value ":"16543.00","rev_share_pct ":"0.05","start_dt":"10-1-2018","end_dt":"31-12-2020","attachment_path ":"na","change_value ":"na","latest_flag ":"Y","w_status ":"20","status ":"ACT"} ],
    "tenant_sites": [ 
    {"tenant_id":"6003","site_master_id":"1020","tn_site_code":"UPWMORA00069473","tn_site_name":"Deendayal Nagar","tn_cluster":"CLUSTER-03","circle_code":"UW","tower_type":"MAST","site_type":"ID","tenancy_type":"EXT","echarge_type":"FIX","primary_tenant":"N","latest_flag ":"Y"}, {"tenant_id":"6003","site_master_id":"1019","tn_site_code":"UPWGHAZ00069467","tn_site_name":"DJ College Newari Road, Modina","tn_cluster":"CLUSTER-03","circle_code":"UW","tower_type":"MAST","site_type":"ID","tenancy_type":"EXT","echarge_type":"FIX","primary_tenant":"N","latest_flag ":"Y"}, {"tenant_id":"6003","site_master_id":"1018","tn_site_code":"UPWMORA00069464","tn_site_name":"Bazar Makhbra","tn_cluster":"CLUSTER-03","circle_code":"UW","tower_type":"RTT","site_type":"OD","tenancy_type":"EXT","echarge_type":"FIX","primary_tenant":"N","latest_flag ":"Y"}, {"tenant_id":"6003","site_master_id":"1016","tn_site_code":"UPWGHAZ00069454","tn_site_name":"Hoshdarpur Garhi","tn_cluster":"CLUSTER-03","circle_code":"UW","tower_type":"RTT","site_type":"OD","tenancy_type":"EXT","echarge_type":"FIX","primary_tenant":"N","latest_flag ":"Y"}, {"tenant_id":"6003","site_master_id":"1011","tn_site_code":"UPWMUZN00069430","tn_site_name":"Sikanderpur","tn_cluster":"CLUSTER-03","circle_code":"UW","tower_type":"RTT","site_type":"ID","tenancy_type":"EXT","echarge_type":"FIX","primary_tenant":"N","latest_flag ":"Y"}, {"tenant_id":"6003","site_master_id":"1008","tn_site_code":"UPWALIG00069299","tn_site_name":"Mukund Vihar","tn_cluster":"CLUSTER-03","circle_code":"UW","tower_type":"RTT","site_type":"","tenancy_type":"EXT","echarge_type":"FIX","primary_tenant":"N","latest_flag ":"Y"} ]
 }
 ]
}
';
$dataset = json_decode($str, true);
//print_r ($dataset);

foreach ($dataset['tenant_view_details'] as $newdata) {
 $general = $newdata['tenant_general'];
 $bank = $newdata['tenant_bank'];
 $agreement = $newdata['tenant_agreement'];
 $sites = $newdata['tenant_sites'];
}
//prinitng data
echo "<br/>";
print_r($general);
echo "<br/>";
print_r($bank);
echo "<br/>";
print_r($agreement);
 echo "<br/>";

foreach($general as $general_data){
 (isset($general_data['tenant_id']) && !empty($general_data['tenant_id']))? $tenant_id=$general_data['tenant_id'] : $tenant_id="not set";
 echo "<br/>tenant_id::" . $tenant_id;
}

foreach($bank as $bank_data){
 (isset($bank_data['bank_name']) && !empty($bank_data['bank_name']))? $bank_name=$bank_data['bank_name'] : $bank_name="not set";     
 echo "<br/>bank_name:" . $bank_data['bank_name'];
}
foreach($agreement as $agreement_data){
 (isset($agreement_data['category']) && !empty($agreement_data['category']))? $category=$agreement_data['category'] : $category="not set";
 (isset($agreement_data['tenancy_type']) && !empty($agreement_data['tenancy_type']))? $tenancy_type=$agreement_data['tenancy_type'] : $tenancy_type="not set";
 (isset($agreement_data['echarge_type']) && !empty($agreement_data['echarge_type']))? $echarge_type=$agreement_data['echarge_type'] : $echarge_type="not set";
 echo "<br/>category:" . $category;
 echo "<br/>tenancy_type:" . $tenancy_type;
 echo "<br/>echarge_type:" . $echarge_type;
}
?>

【问题讨论】:

  • 错字:"tenant_bank": [ { "bank_name " 注意尾随空格
  • 使用 xdebug + IDE 和集成调试客户端,如 Netbeans、Eclipse、PhpStorm。
  • JSON 是如何生成的?

标签: php json parsing


【解决方案1】:

您的问题是,在您的 $bank$category 数组中,所有键上都有尾随空格。如果您更改引用以包含这些空格,则您的代码可以正常工作。见https://3v4l.org/GX5iC

或者,您可以在 foreach 循环中使用类似以下代码的代码来修剪数组键:

$bank_keys = array_map('trim', array_keys($bank_data));
$bank_data = array_combine($bank_keys, array_values($bank_data));

您还可以创建一个递归函数来修剪整个$dataset 值。例如:

function trim_keys($array) {
    foreach ($array as $key => $value) {
        echo "trimming key '$key' to '" . trim($key) . "'\n";
        unset($array[$key]);
        $array[trim($key)] = $value;
        if (is_array($value))
            $array[trim($key)] = trim_keys($value);
        else
            $array[trim($key)] = $value;
    }
    return $array;
}

然后,通过使用

$dataset = trim_keys($dataset);

您的代码可以正常工作。 Demo on 3v4l.org

【讨论】:

  • 如 cmets 中所述,这是一个错字。应该投票结束而不是回答问题,因为其他人寻求解决问题的方法没有任何好处。
  • @Quasimodo'sclone 这并不是一个错字——数据就是这样进入 OP 的。有些键有额外的空间,有些没有。这就是为什么我提供了一个解决方案,它可以修剪键中的空格,这样 OP 就不必单独找出它们。
猜你喜欢
  • 2018-07-09
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多