使用json_encode()并仍然在对象中发送数组

时间:2018-12-17 09:35:18

标签: javascript php arrays json

我发送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,
];

4 个答案:

答案 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']);

demo

答案 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