代码之家  ›  专栏  ›  技术社区  ›  Mirakurun

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

  •  -1
  • Mirakurun  · 技术社区  · 7 年前

    我发送带有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"}}
    

    当我 JSON.parse() 在JS中,它成为一个对象。而且 statuslist 成为嵌套对象,这就是问题所在。

    let res = JSON.parse(data) /* where data is response from server */
    

    当我 console.log(res.statuslist) 我得到以下对象:

    { 1 : "Status1", 2 : "Status2", 3 : "Status3"}
    

    我真正想要的是得到一个我已经拥有的对象,但是状态列表是一个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,
    ];
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   splash58    7 年前

    您可以在json_编码之前使用array_map来完成这项工作。

    $arr['statuslist'] = array_map(null, array_keys($arr['statuslist']), $arr['statuslist']);
    

    demo

        2
  •  4
  •   Mirakurun    7 年前

    好的,所以把您的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) 以获得预期的结果。

        3
  •  0
  •   Errorname    7 年前

    问题来自您的初始数据:

    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数组,它应该可以工作。

    推荐文章