Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.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 JSON编码在取消设置时将键转换为字符串_Php_Json - Fatal编程技术网

PHP JSON编码在取消设置时将键转换为字符串

PHP JSON编码在取消设置时将键转换为字符串,php,json,Php,Json,你们能帮我解释一下这里发生了什么吗 $data[0] = array("one" => "uno", "two" => "dos", "three" => "tres"); $data[1] = array("one" => "uno", "two" => "dos", "three" => "tres"); //unset($data[0]); $encode = json_encode($data); $decode = json_decode($e

你们能帮我解释一下这里发生了什么吗

$data[0] = array("one" => "uno", "two" => "dos", "three" => "tres");
$data[1] = array("one" => "uno", "two" => "dos", "three" => "tres");

//unset($data[0]);

$encode = json_encode($data);

$decode = json_decode($encode);

var_dump($decode);
产出:

array(2) { [0]=> object(stdClass)#1 (3) { ["one"]=> string(3) "uno" ["two"]=> string(3) "dos" ["three"]=> string(4) "tres" } [1]=> object(stdClass)#2 (3) { ["one"]=> string(3) "uno" ["two"]=> string(3) "dos" ["three"]=> string(4) "tres" } }
这是正常的,将其保留为数组,但只要我取消设置数组的一部分,它就会将其转换为obj

$data[0] = array("one" => "uno", "two" => "dos", "three" => "tres");
$data[1] = array("one" => "uno", "two" => "dos", "three" => "tres");

unset($data[0]);

$encode = json_encode($data);

$decode = json_decode($encode);

var_dump($decode);
输出:

object(stdClass)#1 (1) { ["1"]=> object(stdClass)#2 (3) { ["one"]=> string(3) "uno" ["two"]=> string(3) "dos" ["three"]=> string(4) "tres" } }

如何保持一致性?

正如Marc B在评论中解释的那样,您需要将数组重新索引为基于零的索引。在PHP中,可以通过以下方式完成:

另见:


    • 我会看看选项。我认为
      JSON\u FORCE\u OBJECT
      应该强制一致性。

      Javascript区分数组和对象。PHP只有数组可以同时覆盖这两种类型


      从0开始的PHP数组被编码为Javascript数组,其他任何东西都被编码为对象

      JS有点愚蠢,它希望所有数组都是基于0的,并带有连续的数字键。如果你在任何地方跳过一个键(例如,
      1,2,4,5
      ),或者从非零开始,你会得到一个对象。我想说的是
      JSON\u FORCE\u object
      与这里试图实现的相反。他说他想要一致性,而不是必须是一个或另一个。它可能不是最好的选择,但我相信它确实解决了这个问题。第一个索引名称的简洁性也适用于对象属性
      JSON\u FORCE\u OBJECT
      也会通过属性而不是键创建不一致的索引。因此,它只解决了一半的问题(类型不一致),然后解决了全部问题(类型和索引不一致),这也突出了类型不一致只是索引不一致的副作用。但是,首先修复索引不一致性会使类型不一致性过时,这在您的答案中没有说明。与上的示例进行比较
      $encode = json_encode(array_values($data));