我有一个读取目录并在单个对象中加入大量信息的库,因此我可以通过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。我认为这不是一个版本问题(真的吗?)但也许有些指令可以说是这样的。
简单的解决方案是将这些对象转换为数组,没什么大不了的,但我试图理解为什么会发生这种情况并优化我的代码。
答案 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}