PHP 陣列轉 JS 陣列最標準、高效的方式是使用 json_encode()。它能將巢狀陣列、關聯陣列、物件完整序列化為 JSON 字串,前端直接解析為 JS 物件/陣列,無需手動拼接字串。
<?php
// PHP 端:構建多維關聯陣列
$stores = [
[
'area' => '北京地區',
'items' => '10',
'detail' => [
['name' => '旗艦店', 'url' => 'https://www.example.com'],
['name' => '分店A', 'url' => 'https://www.example.com/a']
]
],
[
'area' => '上海地區',
'items' => '11',
'detail' => [
['name' => '旗艦店', 'url' => 'https://www.example.com'],
['name' => '分店B', 'url' => 'https://www.example.com/b']
]
]
];
// 輸出到 JS 變數(注意:需確保頁面編碼為 UTF-8)
?>
<script>
// 直接嵌入,json_encode 輸出合法 JSON,JS 引擎原生解析
const storeData = <?= json_encode($stores, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;
console.log(storeData);
// 存取範例:storeData[0].detail[0].name → "旗艦店"
</script>
\uXXXX,減小體積、利於除錯(PHP 5.4+)。/,URL 更易讀(PHP 5.4+)。<?php
// 假設使用 PDO
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$areas = $pdo->query("SELECT catid, catname, items FROM category WHERE parentid = 10")->fetchAll(PDO::FETCH_ASSOC);
$result = [];
foreach ($areas as $area) {
$areaData = [
'area' => $area['catname'],
'items' => $area['items'],
'detail' => []
];
$stmt = $pdo->prepare("SELECT title, url FROM news WHERE catid = ?");
$stmt->execute([$area['catid']]);
while ($shop = $stmt->fetch(PDO::FETCH_ASSOC)) {
$areaData['detail'][] = [
'name' => $shop['title'],
'url' => $shop['url']
];
}
$result[] = $areaData;
}
// 輸出 JSON
header('Content-Type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
?>
| 問題 | 原因 | 解決 |
|---|---|---|
| 中文變亂碼 | 資料非 UTF-8 編碼 | 資料庫連線設定 SET NAMES utf8mb4,PHP 檔案存為 UTF-8 無 BOM,必要時 mb_convert_encoding |
| 前端報 SyntaxError | 直接 echo 陣列或未加引號 | 務必用 json_encode,JS 側用 const data = <?= ... ?>;(無引號)或 AJAX 請求 |
| 索引陣列變物件 | PHP 陣列鍵非連續數字 | 用 array_values() 重建索引,或前端 Object.values() 處理 |
| 大數據量效能差 | json_encode 佔用大量記憶體 | 分頁載入、改用 JSON Stream(如 jsond 擴展)或前端分批請求 |
$jsonStr = '{"name":"Alice","age":25}';
$arr = json_decode($jsonStr, true); // 第二參數 true → 關聯陣列;false → stdClass 物件
var_dump($arr);
若 JSON 直接內嵌於 HTML <script> 標籤中,確保資料經過 json_encode(已處理引號、換行、</script> 等風險字元)。若透過 AJAX 回應,設定 Content-Type: application/json 並啟用 CORS 策略。