我添加这个是为了解释原始答案的情况。您可以在示例部分的json_encode php manual page 中找到相同的信息。
对于任何简单的 PHP 数组,json_encode 都会将 PHP 数组转换为 JSON 数组:
$simple = array('apple', 'banana', 'coconut');
echo json_encode($simple);
返回:
["苹果","香蕉","椰子"]
任何关联数组都会变成一个 json 对象{},每个关联键都会变成一个属性名。
$associative = array('breakfast' => 'apple', 'lunch' => 'banana', 'dinner' => 'coconut');
echo json_encode($associative);
返回:
{"早餐":"苹果","午餐":"香蕉","晚餐":"椰子"}
在您的示例中,您有一个带有关联键“帐户”的数组,其中包含一个包含 2 个子元素的数组,每个子元素都有一个关联键。
这就是 json_encode() 将您的结构转换为 json 对象的原因。
在@Smokie 的回答中,添加了一个“简单”的额外父数组,即。未键入名称,导致 json_encode(遵循其简单的转换规则)创建一个 javascript 数组,然后将 javascript 对象粘贴到该数组中。
$username = 'test user';
$email = 'foo@bar.com';
$db_export = [
'account' => [[ // <--- Added
'username' => $username,
'email' => $email
]] // <--- Added
];
var_dump($db_export);
返回:
array(1) {
["account"]=>
array(1) {
[0]=>
array(2) {
["username"]=>
string(9) "test user"
["email"]=>
string(11) "foo@bar.com"
}
}
}
这里我使用 var_dump 作为快速调试工具来显示 PHP 数组的样子。需要注意的重要一点是,“帐户”现在是一个数组 (1),其中一个元素(第 0 个元素)包含您的原始子数组。
您可能需要这个,因为假设一个帐户可能有多个帐户名/电子邮件地址对。如果不是这种情况,我会质疑您为什么需要强制使用无用的数组。我个人不明白一个“帐户”如何有多个与之关联的用户名/电子邮件对。
话虽如此,这段代码应该进一步说明这一切是如何工作的,以及为什么:
$username = 'test user';
$email = 'foo@bar.com';
$db_export = [
'account' => [[ // <--- Added
'username' => $username,
'email' => $email
]] // <--- Added
];
//Add another username/email pair to account
$db_export['account'][] = ['username' => 'test2 user', 'email' => 'test2@bar.com'];
echo json_encode($db_export, JSON_PRETTY_PRINT);
返回:
{
"account": [
{
"username": "test user",
"email": "foo@bar.com"
},
{
"username": "test2 user",
"email": "test2@bar.com"
}
]
}