我发送ID为AJAX的请求,并且期望PHP响应并提供其他信息。 PHP的响应如下:
Array
(
[success] => 1
[id] => 20
[fullname] => John Doe
[statuslist] => Array
(
[1] => Status1
[2] => Status2
[3] => Status3
)
)
当我json_encode()
return json_encode($response);
我得到这样的答复:
{"success":true,"id":"20","fullname":"John Doe","statuslist":{"1":"Status1","2":"Status2","3":"Status3"}}
当我在JS中JSON.parse()
时,它成为一个对象。但是statuslist
也变成了嵌套对象,这就是问题所在。
let res = JSON.parse(data) /* where data is response from server */
console.log(res.statuslist)
出现以下内容:
{ 1 : "Status1", 2 : "Status2", 3 : "Status3"}
我真正想要得到的是一个已经存在的对象,但是statuslist是一个2D数组,我将在console.log(res.statuslist)
上获得输出:
[
["1", "Status1"],
["2", "Status2"],
["3", "Status3"]
]
我的PHP数组如下:
$statusList = ArrayHelper::map(\app\models\SomeModel::find()->all(), 'id', 'title');
$response = [
'success' => true,
'id' => $id,
'fullname' => $user->fullname,
'statuslist' => $statusList,
];
答案 0 :(得分:4)
好,因此将您的PHP代码视为;
$statusList = ArrayHelper::map(\app\models\SomeModel::find()->all(), 'id', 'title');
$response = [
'success' => true,
'id' => $id,
'fullname' => $user->fullname,
'statuslist' => $statusList,
];
据此,我认为$statusList
是类似的关联数组;
$statusList = Array
(
[1] => Status1
[2] => Status2
[3] => Status3
)
$statusList2d = Array();
foreach ($statusList as $key => $value) {
$innerArray = Array();
array_push($innerArray, $key, $value);
array_push($statusList2d, $innerArray);
}
$response = [
'success' => true,
'id' => $id,
'fullname' => $user->fullname,
'statuslist' => $statusList2d
];
现在,您可以执行json_encode($response)
以获得预期的结果。
答案 1 :(得分:1)
您可以在json_encode之前使用array_map进行工作
$arr['statuslist'] = array_map(null, array_keys($arr['statuslist']), $arr['statuslist']);
答案 2 :(得分:0)
问题来自您的初始数据:
Array
(
[success] => 1
[id] => 20
[fullname] => John Doe
[statuslist] => Array
(
[1] => Status1
[2] => Status2
[3] => Status3
)
)
因为statuslist
的索引以1
而不是0
开头,所以json_encode()
认为它不是数组并将其编码为对象:
{ 1 : "Status1", 2 : "Status2", 3 : "Status3"}
从索引0开始启动PHP数组,它应该可以工作。
答案 3 :(得分:0)
使用javascript(即客户端)的另一种解决方案是在statuslist
对象上使用Object.entries()方法(ECMAScript 2017)将其转换为数组。
//Assume you get the data as a JSON string
let data = '{"success":true,"id":"20","fullname":"John Doe","statuslist":{"1":"Status1","2":"Status2","3":"Status3"}}';
let res = JSON.parse(data); //parse the string
//Use Object.entries to convert object to an array with [key, value] pairs
res.statuslist = Object.entries(res.statuslist);
console.log(res); //check result