【问题标题】:PHP json_encode as object after PHP array unset()PHP json_encode 作为 PHP 数组 unset() 之后的对象
【发布时间】:2011-04-21 14:42:46
【问题描述】:

在使用 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 代码

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

【问题讨论】:

  • +1 因为很高兴看到一个问得很好的问题。 :)

标签: php javascript json


【解决方案1】:

尝试对 json_encode 使用 JSON_FORCE_OBJECT 选项,例如:json_encode($a, JSON_FORCE_OBJECT),这样您将始终得到相同的结果。

【讨论】:

    【解决方案2】:

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

    unset($a[1]);
    

    改为:

    array_splice($a, 1, 1);
    

    【讨论】:

    • 绝对完美的方式来完成这项工作而不会弄乱收藏,谢谢!
    • 这个。最优雅的方式。
    【解决方案3】:

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

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

    【讨论】:

    • 或者,您可以在取消设置元素后对数组进行排序。
    • @NullUserException 虽然这会产生对数组进行排序的副作用。
    • 对于那些想知道unset 行为的人,查看以下链接并向下滚动到“有用的函数”:us3.php.net/manual/en/language.types.array.php“unset() 函数允许从数组中删除键。请注意数组不会被重新索引”
    • @NullUserException 很棒的补充!无论如何都需要对数组进行排序 - 用一块石头杀死两只鸟。
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2019-11-27
    相关资源
    最近更新 更多