深入理解PHP JSON數(shù)組與對(duì)象

字號(hào):


    在PHP后端和客戶端數(shù)據(jù)交互的過(guò)程中,JSON數(shù)據(jù)中有時(shí)格式不定,一會(huì)兒是數(shù)組,一會(huì)兒是對(duì)象,弄得客戶端開(kāi)發(fā)人員要崩潰的感覺(jué)。
    因此,前后端相關(guān)人員先對(duì)PHP的json_encode函數(shù)原理有必要的了解是最重要的一個(gè)環(huán)節(jié)。
    PHP中的array是個(gè)萬(wàn)能的數(shù)據(jù)結(jié)構(gòu),并不像其它語(yǔ)言根據(jù)需要的場(chǎng)景會(huì)定義很多約束性的數(shù)據(jù)類型來(lái)描述結(jié)構(gòu),所以PHP程序員是很難給客戶端人員講清楚返回的是什么結(jié)構(gòu)的數(shù)據(jù)的。
    也就變成明明是通過(guò)PHP的數(shù)組數(shù)據(jù)編碼成json的,但輸出值有時(shí)是數(shù)組、有時(shí)是對(duì)象的情況。
    <?php
    /*
    如果你想生成一個(gè)json格式的數(shù)組格式(Vector)而非對(duì)象格式(Map)的,那么數(shù)據(jù)的下標(biāo):
    必須是數(shù)字索引,
    必須從0開(kāi)始,
    必須從小到大依次增加、中間不可以跳躍、順序不可變動(dòng).
    */
    //符合數(shù)組
    $vector = [
    12, 23, 18
    ];
    echo json_encode($vector);
    //符合數(shù)組
    $vector2 = [
    0 => 12, 1 => 23, 2 => 18
    ];
    echo json_encode($vector2);
    //不符合數(shù)組,下標(biāo)有跳躍
    $map = [
    0 => 12, 1 => 23, 2 => 18, 4 => 20
    ];
    echo json_encode($map);
    //不符合數(shù)組,下標(biāo)順序不對(duì)
    $map = [
    0 => 12, 1 => 23, 3 => 18, 2 => 20
    ];
    echo json_encode($map);
    //不符合數(shù)組,下標(biāo)沒(méi)有從0開(kāi)始
    $map_1 = [
    1 => '111', 2 => 'asdfa'
    ];
    echo json_encode($map_1);
    //典型的對(duì)象格式
    $map_2 = ['abc' => 1, 'de' => 2, 'fi' => null];
    echo json_encode($map_2);
    /**
    * 請(qǐng)注意上面的變量命名,對(duì)應(yīng)于Hack中的概念,Vector和Map為兩種數(shù)據(jù)集合類型
    * 如果你需要將"索引數(shù)組"強(qiáng)制轉(zhuǎn)化成"對(duì)象",可以這樣寫(xiě)
    * json_encode((object) $a);
    * 或
    * json_encode ($a, JSON_FORCE_OBJECT);
    *
    */
    解決方案是什么呢?
    就是通過(guò)PHP封裝Vector和Map這兩種數(shù)據(jù)結(jié)構(gòu)的類,在構(gòu)造json輸出結(jié)構(gòu)時(shí),以這兩種類型做封裝和轉(zhuǎn)換,來(lái)確保結(jié)構(gòu)的確定性。
    以上所述是小編給大家介紹的PHP JSON數(shù)組與對(duì)象,希望對(duì)大家有所幫助