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));