簡體   English   中英

如何在PHP中解碼JSON嵌套數組值?

[英]How to decode JSON nested array values in PHP?

所以我有這個JSON字符串:

"{"Jan": [5, 10, 15, 20] , 
  "Feb":[20,10,"",22], 
  "Mar":[5,3,"",4], 
  "April":[10,"",1,2]
 }, 
 {"title":"Test Chart - Month v Value"}"

我試圖提取數據,以便可以訪問每個數據,以便可以遍歷數組並順序輸出數據。

我能想到的最好的方法是簡單地在PHP中創建一個數組數組,將鍵及其值存儲在一起,並進行嵌套的for循環。 因此,數組應如下所示:

[[Jan, 5, 10, 15, 20],[Feb, 20, 10, ,22], [Mar, 5, 3, , 4]]

最后,我想知道如何將該標題值存儲到其自己的變量中。

您的字符串當前不是有效的json,但確實包含兩個有效的json字符串。 json_decode()函數無法按原樣在您的字符串上工作,但在每個有效的json字符串上都可以工作:

<?php

// INVALID JSON STRING - THIS WON'T WORK:
$json = '{"Jan": [5, 10, 15, 20] , "Feb":[20,10,"",22], "Mar":[5,3,"",4], "April":[10,"",1,2]}, {"title":"Test Chart - Month v Value"}';
print_r(json_decode($json));

// This works:
$json = '{"Jan": [5, 10, 15, 20] , "Feb":[20,10,"",22], "Mar":[5,3,"",4], "April":[10,"",1,2]}';
print_r(json_decode($json));

// This works:
$json = '{"title":"Test Chart - Month v Value"}';
print_r(json_decode($json));

?>

理想情況下,您將修復源json,但是它可能會傳遞給您或從您無法控制的系統中檢索。

如果可以安全地假設json始終具有示例中的結構,則可以將字符串拆分成類似以下內容:

if (preg_match_all("/{[^}]*}/", $str, $matches)) {
  foreach ($matches[0] AS $json) {
    print_r(json_decode($json));
  }
}

如果json對象包含其他對象,則此方法將不起作用,這就是為什么它取決於您是否可以安全地假定結構始終相同的原因。

試試這個代碼

<?php

$jsonData = '[{
    "Jan": [5, 10, 15, 20],
    "Feb": [20, 10, "", 22],
    "Mar": [5, 3, "", 4],
    "April": [10, "", 1, 2]
}, {
    "title": "Test Chart - Month v Value"
}]';


$array = json_decode($jsonData ,true);
$formattedArr = array();
$i = 0;

foreach($array[0] as $key=>$val) {

    $formattedArr[$i] = $val;
    array_unshift($formattedArr[$i],$key);
    $i++;
}

echo "<pre>";
print_r($formattedArr);

?>

您應該將JSON格式化為Barmar建議的格式(檢查您的評論),當前您的JSON字符串格式不正確。

$json = '{"title":"Test Chart - Month v Value", "data": {"Jan": [5, 10, 15, 20], "Feb":[20,10,"",22], "Mar":[5,3,"",4], "April":[10,"",1,2]}}'

這會將字符串更改為以下PHP數組:

print_r($arr = json_decode($json, true));

Array
(
    [title] => Test Chart - Month v Value
    [data] => Array
        (
            [Jan] => Array
                (
                    [0] => 5
                    [1] => 10
                    [2] => 15
                    [3] => 20
                )

            [Feb] => Array
                (
                    [0] => 20
                    [1] => 10
                    [2] => 
                    [3] => 22
                )

            [Mar] => Array
                (
                    [0] => 5
                    [1] => 3
                    [2] => 
                    [3] => 4
                )

            [April] => Array
                (
                    [0] => 10
                    [1] => 
                    [2] => 1
                    [3] => 2
                )

        )

)

現在您可以像這樣訪問數據:

echo $arr['title'];
print_r($arr['data']);
print_r($arr['data']['Jan']);
$data = '{"Jan": [5, 10, 15, 20] , "Feb":[20,10,"",22], "Mar":[5,3,"",4], "April":[10,"",1,2],"title":"Test Chart - Month v Value"}';

$out = json_decode($data, true);
$newArray = array();
foreach ($out as $key=>$value){
    if(is_array($value)){
        foreach($value as $key1=>$row){
            $value[$key1+1] = $row;     
        }
        $value[0] = $key;
        $newArray[] = $value; 
    }
}

echo json_encode($newArray);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM