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

lee*_*ers 21 javascript php 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
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)

节目输出

C:\Users\usr\Desktop>php test.php
[{"abc":"123"},{"jkl":"234"},{"nmo":"567"}]
{"0":{"abc":"123"},"2":{"nmo":"567"}}
Run Code Online (Sandbox Code Playgroud)

如您所见,第一次$a转换为JSON,它被编码为javascript数组.第二次(在unset调用之后)$a被编码为javascript对象.为什么这样,我该如何预防呢?

zne*_*eak 19

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

您可以编码array_values($a),它将返回一个重建索引的数组.


lee*_*ers 7

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

unset($a[1]);
Run Code Online (Sandbox Code Playgroud)

代替:

array_splice($a, 1, 1);
Run Code Online (Sandbox Code Playgroud)