Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么unset()会改变json_编码字符串格式的方式?_Php_Json_Unset - Fatal编程技术网

Php 为什么unset()会改变json_编码字符串格式的方式?

Php 为什么unset()会改变json_编码字符串格式的方式?,php,json,unset,Php,Json,Unset,我注意到今天使用和json_decode/json_encode有一些有趣的事情。代码如下: echo "<h3>1) array as string</h3>"; $sa = '["item1","item2","item3"]'; var_dump($sa); echo "<h3>2) array as string decoded</h3>"; $sad = json_decode($sa); var_dump($sad); echo "&l

我注意到今天使用和json_decode/json_encode有一些有趣的事情。代码如下:

echo "<h3>1) array as string</h3>";
$sa = '["item1","item2","item3"]';
var_dump($sa);
echo "<h3>2) array as string decoded</h3>";
$sad = json_decode($sa);
var_dump($sad);
echo "<h3>3) array as string decoded, then encoded again. <small>(Note it's the same as the original string)</small></h3>";
$sade = json_encode($sad);
var_dump($sade);
echo "<h3>4) Unset decoded</h3>";
unset($sad[0]);
var_dump($sad);
echo "<h3>5) Encode unset array. <small>(Expecting it to look like original string minus the unset value)</small></h3>";
$ns = json_encode($sad);
var_dump($ns);
echo "<h3>6) Decode Encoded unset array</h3>";
var_dump(json_decode($ns));
echo“1)数组作为字符串”;
$sa='[“项目1”、“项目2”、“项目3”];
var_dump(南非元);
echo“2)作为字符串解码的数组”;
$sad=json_解码($sa);
var_dump($sad);
echo“3)数组作为字符串解码,然后再次编码(注意它与原始字符串相同);
$sade=json_encode($sad);
var_dump($sade);
回声“4)未设置解码”;
未设置($sad[0]);
var_dump($sad);
echo“5)对未设置数组进行编码(期望它看起来像原始字符串减去未设置值)”;
$ns=json_encode($sad);
var_dump($ns);
echo“6)解码编码的未设置数组”;
变量转储(json解码($ns));
结果是:


所以我的问题是:为什么unset()会改变json_编码使其成为字符串的方式?如何实现与原始字符串相同的字符串格式?

json不需要包含偏移量为零的连续键序列的键

从标准枚举数组中取消设置值会在该数组的键序列中留下间隙,它不会以任何方式调整剩余的键;因此json需要通过包含键来反映这种差异

如果要再次将键从偏移量0重置为连续序列,则

unset($sad[0]);
$sad = array_values($sad);
然后再次进行json编码/解码


在数字5中,如果您注意到键从
1开始。通常,数组(在php和json中)以零开头。json中的非零索引数组(或具有非连续数字的数组)是对象文字,而不是数组。如果您想要相同的字符串格式,我建议您通过json_解码传递第二个参数,将其强制传递给数组。然后可以使用数组函数将数组重新索引为数字,例如或。或者,当json_对数组进行编码时,您可以自己重新为数组编制索引。

换句话说,JS没有关联数组,因此
json_encode()
将其转换为对象以保留密钥。