2017-06-01 43 views
2

我有一个库,它可以读取一个目录并在单个对象中加入大量信息,所以我可以通过JSON获取它并使用JavaScript进行处理。我有一个调用的lib我和返回JSON的PHP,这样简单:PHP json_encode将数组切换到特定服务器中的对象...为什么?

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。我不认为是一个版本问题(真的?),但也许一些指令告诉工作是这样的。

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

回答

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} 
+0

有趣。那么,通过使用readdir和$ this-> Lista [] = $ ldArq;来创建一个空数组($ this-> Lista = array();),然后逐个创建一个空数组。除此之外,还有一些排序操作(按日期,名称等)可能发生与否。我会尝试重新列举阵列,看看我是否会有连续的索引... – Gustavo

+1

是的!通过添加$ this-> Lista = array_values($ this-> Lista);该列表现在被视为简单的顺序数组[]。仍然是一个谜,为什么相同的代码在其他环境尝试做同样的任务有不同的工作......我错过了一些东西......但是这条简单的线将防止进一步的问题。我建议你在答案中加入这个解决方案,这样我就可以标记它。 – Gustavo

+0

在底部添加。认为这将是更容易找出为什么索引是他们的方式:) – AbraCadaver

相关问题