如何将PHP json_encode作为PHP数组之后的对象unset()?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

在使用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对象。为什么是这样以及如何防止它?

提问于
用户回答回答于

原因是你的数组有一个漏洞:它具有索引0和2,但JSON不能编码带有漏洞的数组,因为数组语法不支持索引。

你可以编码array_values($a),这将返回一个reindexed数组。

用户回答回答于

除了array_values技术是可以使用的array_splice并在一个步骤中删除元素和重新索引:

unset($a[1]);

相反:

array_splice($a, 1, 1);

扫码关注云+社区