【问题标题】:json_encode PHP array as JSON array not JSON objectjson_encode PHP 数组作为 JSON 数组而不是 JSON 对象
【发布时间】:2021-12-13 09:23:34
【问题描述】:

我在 PHP 中有以下数组:

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => name1
            [short_name] => n1
        )

    [2] => Array
        (
            [id] => 2
            [name] => name2
            [short_name] => n2
        )
)

我想将其 JSON 编码为 JSON 数组,生成如下字符串:

[  
    {  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    {  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
]

但是当我在这个数组上调用json_encode 时,我得到以下信息:

{  
    "0":{  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    "2":{  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
}

这是一个对象而不是一个数组。

我怎样才能让json_encode 将我的数组编码为数组呢?

【问题讨论】:

    标签: php json


    【解决方案1】:

    参见 RFC 8259 中的 ArraysJavaScript 对象表示法 (JSON) 数据交换格式

    数组结构表示为围绕零的方括号 或更多值(或元素)。元素用逗号分隔。

    array = begin-array [ value *( value-separator value ) ] end-array

    您正在观察这种行为,因为您的数组不是连续的 - 它有键 02,但没有 1 作为键。

    只有数字索引是不够的。 json_encode 只会将您的 PHP 数组编码为 JSON 数组,前提是您的 PHP 数组是连续的 - 也就是说,如果它的键是 0、1、2、3,...

    您可以使用array_values 函数按顺序重新索引您的数组以获得您想要的行为。例如,以下代码在您的用例中成功运行:

    echo json_encode(array_values($input)).
    

    【讨论】:

    【解决方案2】:

    JSON 中的Array 是索引数组,因此您尝试获取的结构不是有效的 Json/Javascript。

    PHP Associatives 数组是 JSON 中的对象,因此除非不需要索引,否则无法进行此类转换。

    如果你想得到这样的结构,你可以这样做:

    $indexedOnly = array();
    
    foreach ($associative as $row) {
        $indexedOnly[] = array_values($row);
    }
    
    json_encode($indexedOnly);
    

    将返回类似:

    [
         [0, "name1", "n1"],
         [1, "name2", "n2"],
    ]
    

    【讨论】:

    • 感谢您给我索引数组的线索 :) 问题是我索引它的方式是 id 也是数组的 id 而不是顺序 id 并且 json_encode 没有选择它作为一个数组但作为对象而不是因为该数组不是顺序的,现在它已修复,感谢您的所有帮助:)
    • 不正确。一些库确实将关联数组编码为具有索引作为元素属性之一的数组。
    • 我不明白你的意思 - Martin 的答案中的数组是非索引的,这是有效的 JSON。
    • @AndFinally,Martin 的答案 is 中的数组实际上是隐式索引的。省略索引会导致索引数组从零开始。
    • 这个答案并没有完全提供 OP 在他们发布问题时想要的东西(毫不奇怪,因为 OP 想要的东西是不可能的),从那时起他们对它的编辑似乎留下了这个答案鉴于问题的当前状态,这是完全错误的。您不能删除此答案,因为它已被接受,但可能会标记版主为您删除它?由于它有超过 5 个赞成票,因此您将保留您的代表。
    【解决方案3】:

    json_decode($jsondata, true);

    true 将所有属性转换为数组(顺序或非顺序)

    【讨论】:

    • 与 OP 提出的问题无关。 OP专门询问使用json_encode遇到的编码问题
    • 这怎么不相关?这显示了使用 json_encode 的示例,因此它将数据转换为可读数组。 OP 的问题是“我怎样才能让 json_encode 将我的数组编码为数组”我的代码就是这样做的。我猜是“编码”这个词让你感到沮丧?通过“编码”,他的意思是“变成”。这不是投反对票的理由。
    • 哦,我现在明白你的意思了,你会推荐这样的东西 $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); 最后 finallySerializedInArrayFormat = json_encode($unserialize); 如果这是你想要的,你是对的,但似乎有点啰嗦的解决方案.
    【解决方案4】:

    试试这个,

    <?php
    $arr1=array('result1'=>'abcd','result2'=>'efg'); 
    $arr2=array('result1'=>'hijk','result2'=>'lmn'); 
    $arr3=array($arr1,$arr2); 
    print (json_encode($arr3)); 
    ?>
    

    【讨论】:

    • 这并不能解决 OP 试图提出的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2013-09-11
    • 2018-04-21
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多