1. 程式人生 > >PHP json_encode函式的引數說明

PHP json_encode函式的引數說明

       最近遇到了一些關於PHP函式相關的問題,在和前輩交流的時候被問及自己所能寫出的關於字串處理和陣列相關的函式問題,然後考慮了一下,覺著這些PHP最基礎的部分可能在面試中小型公司的時候會被經常問到,在之前的求職面試裡面自己更多的注重了資料結構,演算法或者資料庫相關的這些知識點,對於PHP的基礎相關的知識點在工作中也是常常不能熟悉的運用,一般的狀態更多是知道有這個函式在,然後百度或者查下手冊,在解決了自己的問題之後便降至拋之腦後,雖然能夠回答出來一部分函式,但是前輩在深入的問及關於函式有幾個引數的時候卻又是一臉懵逼。在之前個人認為自己在PHP這個語言以及PHP後端開發上面應該是稍微比較駕輕就熟的一個狀態,一般的問題應該對自己來說都問題不大了,卻被區區函式問題搞得心態爆炸,仔細思考了之後覺得如果我連這些基礎的知識點都不能夠很熟練的話,那我還有什麼話可以說我PHP很熟練。現在準備在空閒時間都能夠思考一下自己所用過的函式或者其他知識點,也希望能夠讓自己的思考成為慣性。

    今天主要看了一下json_encode函式的引數以及使用,以下主要是對json_encode第2/3個引數的一些自己認為的解析。

    首先看一下php.net中關於json_encode的說明:

            Description 

            string json_encode ( mixed $value [, int $options

 = 0 [, int $depth = 512 ]] )

            Returns a string containing the JSON representation of the supplied value // 返回json格式的字串

            The encoding is affected by the supplied options and additionally the encoding of float values depends on the value of serialize_precision

.                                                                     // 所返回json格式的字串取決於第二個引數

      一:   json_encode常常被用於將陣列轉換成json格式的字串來表示,但是json_encode的第一個引數卻並不一定是陣列格式,第一個引數可以為物件,陣列,字串。


$array = [
      'a' => 'he',
      'b' => 'llo',
      'c' => 'world',
      'd' => [
            1 => 'a',
            2 => 'b',
            3 => 'c'
      ]
];
// 引數為普通陣列    string(62) "{"a":"he","b":"llo","c":"world","d":{"1":"a","2":"b","3":"c"}}"
var_dump(json_encode($array));

// 將陣列先轉為json格式字串,再使用json_decode轉為物件,之後詳細研究json_decode的引數,使用等
$obj = json_decode(json_encode($array));


// 引數為物件    string(62) "{"a":"he","b":"llo","c":"world","d":{"1":"a","2":"b","3":"c"}}"
var_dump(json_encode($obj));

// 引數為字串
// string(90) ""{\"a\":\"he\",\"b\":\"llo\",\"c\":\"world\",\"d\":{\"1\":\"a\",\"2\":\"b\",\"3\":\"c\"}}""
var_dump(json_encode(json_encode($obj)));

var_dump(json_encode('h"e\l/l[o'));  // string(14) ""h\"e\\l\/l[o""
var_dump('h"e\l/l[o'); //string(9) "h"e\l/l[o"

         可以發現object和array型別轉換為json字串之後沒有差別,而string被json_encode之後,string中的【'】,【"】,【\】,【/】會被轉義。

二:接下來看一下第二個引數:
        options參考選自原文https://blog.csdn.net/qd824692746/article/details/50912723 

        JSON_HEX_TAG (integer)    所有的 < 和 > 轉換成 \u003C 和 \u003E。 自 PHP 5.3.0 起生效。

        JSON_HEX_AMP (integer)    所有的 & 轉換成 \u0026。 自 PHP 5.3.0 起生效。

        JSON_HEX_APOS (integer)   所有的 ' 轉換成 \u0027。 自 PHP 5.3.0 起生效。

        JSON_HEX_QUOT (integer)   所有的 " 轉換成 \u0022。 自 PHP 5.3.0 起生效。

        JSON_FORCE_OBJECT (integer)     使一個非關聯陣列輸出一個類(Object)而非陣列。 在陣列為空而接受者需要一個類                (Object)的時候尤其有用。 自 PHP 5.3.0 起生效。

        JSON_NUMERIC_CHECK (integer)    將所有數字字串編碼成數字(numbers)。 自 PHP 5.3.3 起生效。

        JSON_BIGINT_AS_STRING (integer)    將大數字編碼成原始字元原來的值。 自 PHP 5.4.0 起生效。

        JSON_PRETTY_PRINT (integer)    用空白字元格式化返回的資料。 自 PHP 5.4.0 起生效。

        JSON_UNESCAPED_SLASHES (integer)    不要編碼 /。 自 PHP 5.4.0 起生效。

        JSON_UNESCAPED_UNICODE (integer)     以字面編碼多位元組 Unicode 字元(預設是編碼成 \uXXXX)。 自 PHP 5.4.0 起生效。

        大家可以參考以上羅列出來的常量測試一下。也可以選取自己業務邏輯上的來達到自己的目的。

三:接下來說一下第三個引數,在本人購買的PHP中文手冊中發現json_encode函式中只有以上兩個引數,並沒有第三個引數depth,在查閱PHP官方文件中是有這個引數的,但是文件中並沒有詳細的解釋以及示例。猜測大概率是PHP版本的問題,也許購買的中文手冊是基於舊版本的,官方文件是最新版。在測試中發現第三個引數的不同導致的輸出是有區別的。

// 陣列深度為2
  $array = [
          'a' => '"\/hello',
          'b' => '\world',
          'c' => '/php_json_decode',
          'd' => [
                  1 => '"\/php',
                  2 => '//\js',
                  3 => 'python',
                  4 => 'golang'
          ]
      ];

var_dump(json_encode($array,0,1));  // bool(false)


var_dump(json_encode($array,0,2));
// string(120) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"}}"

var_dump(json_encode($array,0,3));
// string(120) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"}}"

var_dump(json_encode($array,0,4));
// string(120) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"}}"


  // 陣列深度為3
  $array = [
          'a' => '"\/hello',
        	'b' => '\world',
        	'c' => '/php_json_decode',
          'd' => [
                  1 => '"\/php',
                  2 => '//\js',
                  3 => 'python',
                  4 => 'golang'
          ],
          'e' => [
                  'xxx' => [
                        'hello' => 'world'
                  ]
          ]
      ];

    var_dump(json_encode($array,0,1));
    // bool(false)

    var_dump(json_encode($array,0,2));
    // bool(false)

    var_dump(json_encode($array,0,3));
    // string(150) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"},"e":{"xxx":{"hello":"world"}}}"

    var_dump(json_encode($array,0,4));
    // string(150) "{"a":"\"\\\/hello","b":"\\world","c":"\/php_json_decode","d":{"1":"\"\\\/php","2":"\/\/\\js","3":"python","4":"golang"},"e":{"xxx":{"hello":"world"}}}"

    發現假如depth的值小於陣列的維度的話會輸出bool(false),反之正常解析成json串。不知道這個欄位存在的意義,希望各位大佬給出正解。