PHP json_encode作为PHP数组unset后的对象()

时间:2010-10-06 02:28:33

标签: php javascript json

使用json_encode删除数字数组键后,我遇到unset的奇怪行为。以下代码应该可以清楚地解决问题。我从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代码

<?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对象。为什么会这样,我该如何预防?

3 个答案:

答案 0 :(得分:17)

原因在于你的数组中有一个洞:它的索引为0和2,但是未命中1. JSON不能编码带孔的数组,因为数组语法不支持索引。

您可以改为编码array_values($a),这将返回重新编制索引的数组。

答案 1 :(得分:5)

除了array_values技术之外,还可以使用array_splice并删除元素并在一个步骤中重新编制索引:

unset($a[1]);

相反:

array_splice($a, 1, 1);

答案 2 :(得分:2)

尝试对json_encode使用JSON_FORCE_OBJECT选项,例如:json_encode($a, JSON_FORCE_OBJECT),因此您将始终拥有相同的结果。