在使用unset
删除数字数组键之后,我在使用json_encode
时遇到了奇怪的行为。下面的代码应该可以清楚地说明问题。我已经在CLI和Apache mod中运行过它:
PHP版本信息:
C:\Users\usr\Desktop>php -v
PHP 5.3.1 (cli) (built: Nov 20 2009 17:26:32)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
代码
<?php
$a = array(
new stdclass,
new stdclass,
new stdclass
);
$a[0]->abc = '123';
$a[1]->jkl = '234';
$a[2]->nmo = '567';
printf("%s\n", json_encode($a));
unset($a[1]);
printf("%s\n", json_encode($a));
程序输出
C:\Users\usr\Desktop>php test.php
[{"abc":"123"},{"jkl":"234"},{"nmo":"567"}]
{"0":{"abc":"123"},"2":{"nmo":"567"}}
正如您所看到的,第一次将$a
转换为JSON时,它被编码为一个javascript数组。第二次(在unset
调用之后),$a
被编码为javascript对象。为什么会发生这种情况,我该如何防止呢?
发布于 2010-10-06 10:33:37
原因是您的数组中有一个空洞:它有索引0和2,但未命中1。JSON不能编码有空洞的数组,因为数组语法不支持索引。
您可以改为对array_values($a)
进行编码,这将返回一个重新索引的数组。
发布于 2010-10-06 10:55:52
除了array_values
技术之外,还可以使用array_splice
,只需一步就可以删除元素并重新建立索引:
unset($a[1]);
而是:
array_splice($a, 1, 1);
发布于 2010-10-08 19:18:24
尝试对json_encode使用JSON_FORCE_OBJECT选项,例如:json_encode($a, JSON_FORCE_OBJECT)
,这样您将始终得到相同的结果。
https://stackoverflow.com/questions/3869129
复制相似问题