首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP json_encode 輸出格式控制:從數組到對象的鍵值規則詳解

     編輯:PHP 綜合知識

核心問題

為什麼 json_encode(['a','b']) 輸出 ["a","b"],而 json_encode([1=>'a',2=>'b']) 輸出 {"1":"a","2":"b"}?本文徹底解析 PHP 數組轉 JSON 時的「數組 vs 對象」判定邏輯。

判定規則(PHP 官方實現)

json_encode 將 PHP 數組視為 JS 數組(列表) 的條件:

  1. 鍵為 連續整數 且 從 0 開始(0,1,2...)。
  2. 無任何字符串鍵(關聯鍵)。

否則輸出為 JS 對象(字典)。

代碼驗證所有情況

 'a', 2 => 'b', 3 => 'c'];
echo json_encode($arr), "\n"; // {"1":"a","2":"b","3":"c"}

// 2. 連續從 0 開始 → 數組
$arr = [0 => 'a', 1 => 'b', 2 => 'c'];
echo json_encode($arr), "\n"; // ["a","b","c"]

// 3. 無顯式鍵(自動 0 開始) → 數組
$arr = ['a', 'b', 'c'];
echo json_encode($arr), "\n"; // ["a","b","c"]

// 4. 索引有間隙 → 對象
$arr = [0 => 'a', 1 => 'b', 5 => 'f'];
echo json_encode($arr), "\n"; // {"0":"a","1":"b","5":"f"}

// 5. 混合字符串鍵 → 對象
$arr = [0 => 'a', 1 => 'b', 'extra' => 'other'];
echo json_encode($arr), "\n"; // {"0":"a","1":"b","extra":"other"}

// 6. 實戰:數據庫 ID 作為鍵導致輸出對象
$users = [
    10 => ['name' => '張三'],
    20 => ['name' => '李四'],
];
echo json_encode($users); // {"10":{...},"20":{...}} ❌

// 修正:重置鍵或包裹層級
$list = array_values($users); // 強制重置為 0,1
echo json_encode(['list' => $list, 'count' => count($list)]);
// {"list":[{"name":"張三"},{"name":"李四"}],"count":2} ✅

中文 Unicode 轉義控制

PHP 5.4+ 支持 JSON_UNESCAPED_UNICODE 選項:

json_encode($arr, JSON_UNESCAPED_UNICODE); // 直接輸出中文,不轉 \uXXXX

不推薦常規使用:增加傳輸體積,前端現代框架均自動處理 Unicode,保持默認轉義更標準、更安全。

最佳實踐模式

function apiResponse(array $list, array $meta = []): string {
    $data = ['list' => array_values($list)]; // 強制列表格式
    if ($meta) $data = array_merge($data, $meta);
    return json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}

總結速查表

PHP 數組特徵JSON 輸出類型典型場景
連續數字鍵 0,1,2... 無字符串鍵Array [...]列表、集合、隊列
數字鍵不從 0 開始 / 有間隙 / 混合字符串鍵Object {...}字典、映射、數據庫主鍵映射
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved