PHP json_encode将数组切换到特定服务器中的对象......为什么?

时间:2017-06-01 14:28:19

标签: php json

我有一个读取目录并在单个对象中加入大量信息的库,因此我可以通过JSON获取它并使用JavaScript进行处理。我有一个php为我调用lib并返回JSON,简单如下:

echo('&vars_ini=OK&dados='.json_encode($Lista).'&vars_fim=');

获得“dados”的价值后,这就是我得到的:

{"erro":"OK","Lista":[{"nome":"a-process.gif","base":"a-process","ext":"gif","bytes":93117,"datac":"07\/04\/2016 13:46","datam":"31\/05\/2017 20:06","timestampc":1460047579,"timestampm":1496272006}, ... etc. there is also other lists as subdirectories.

但是在这个特定的服务器中,我得到了这个:

{"erro":"OK","Lista":{"22":{"nome":"a-process.gif","base":"a-process","ext":"gif","bytes":93117,"datac":"03\/08\/2016 18:33","datam":"03\/08\/2016 18:26","timestampc":1470249183,"timestampm":1470248785},"43":{"nome":"g-agenda.gif","base":"g-agenda","ext":"gif","bytes":1454,"datac":"03\/08\/2016 18:33","datam":"03\/08\/2016 18:26","timestampc":1470249183,"timestampm":1470248786}, ... etc.

使用“[”代替“Lista”,而不是“{”。我的测试服务器运行的是php 5.6.10,这个服务器是5.6.27。我认为这不是一个版本问题(真的吗?)但也许有些指令可以说是这样的。

简单的解决方案是将这些对象转换为数组,没什么大不了的,但我试图理解为什么会发生这种情况并优化我的代码。

1 个答案:

答案 0 :(得分:2)

您需要在0启动数组并连续递增以获取JSON数组。如果做不到这一点,请使用array_values()json_encode()之前重新索引PHP数组。

在第一个示例中,数组索引从0开始,因此json_encode()将其视为数组。在第二个数组索引从22开始,因此它被视为一个对象。索引也需要连续生成数组。不知何故,您在每个实例中生成或获取不同的索引(可能是排序或定义或移动索引的其他函数)。

这显示了从0开始的连续索引:

$v = range(1,5);
print_r($v);
echo json_encode($v);

产生一个数组:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
[1,2,3,4,5]

1开始:

$k = range(1,5);
$z = array_combine($k, $v);    
print_r($z);
echo json_encode($z);

产生一个物体:

Array
(
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
)
{"1":1,"2":2,"3":3,"4":4,"5":5}

从具有非连续索引的0开始:

$z = array(0, 2=>2, 3=>3, 5=>5);
print_r($z);
echo json_encode($z);

产生一个物体:

Array
(
    [0] => 0
    [2] => 2
    [3] => 3
    [5] => 5
)
{"0":0,"2":2,"3":3,"5":5}