请教一个 PHP 里数组删除某个元素后原值类型的问题

2016-06-04 09:43:31 +08:00
 my101du

最近在用 LeanCloud 的 PHP SDK ,有一个场景是这样的。

获取到一个数组,格式如下:(这个是 LeanCloud 的 Class 里存储的样子,实际上在客户端里是正常的数组形式)

$test = [
    {"title": "aaa"},
    {"title": "bbb"},
    {"title": "ccc"}
]

使用 unset($test[1]) 后,传回到 LeanCloud ,触发了 Exception ,提示你上传了一个 Object ,而不是 Array 。

我用 print_r 输出后,这个处理后的数组是正常显示的(索引剩下 0 、 2 )

然后用 is_array($test) 得到 true

然后发现当 unset($test[2]) (即删除最后一个元素),再提交到 LeanCloud ,却没有说这是一个 Object 了。

那么是不是当索引的顺序被破坏后,一个 Array 就变成了 Object ,那为什么 is_array 仍然返回 true呢?

2620 次点击
所在节点    问与答
7 条回复
fising
2016-06-04 10:10:48 +08:00
你写的这到底是 php 还是 js
msg7086
2016-06-04 10:15:17 +08:00
msg7086
2016-06-04 10:17:23 +08:00
PHP 里的 Array 对数组和哈希表的区分并没有明确的界限。
你删掉第二个元素以后,这个 Array 就不是数组而是哈希表了。
[1, 2, 3] 删掉第二个元素以后就变成了 [0=>1, 2=>3]。
lynnworld
2016-06-04 10:20:06 +08:00
php 里面 array 既可以是数组又可以是 hash,在 json 序列化的时候,如果 index 不是从 0 开始连续的数字就认为是 hash ,序列化成{} 对象了。你 unset 之后可以使用 array_merge 帮你重新排一下下标。
500miles
2016-06-04 11:01:24 +08:00
没错儿, php 中的 array 是如此的 amazing.....

真数组 在这里叫 索引数组 , map 或者 字典等 在这里叫做 关联数组

------

做个实验就知道了..

$amazing = [1, 2, 3];

echo json_encode($amazing); // output : "[1,2,3]"

unset($amazing[1]);

echo json_encode($amazing); // output : "{"0":1,"2":3}"
my101du
2016-06-04 11:01:54 +08:00
@msg7086
@lynnworld 非常感谢两位的解答,明白了。 我对这些深入的东西了解太少了
void1900
2016-06-04 11:59:14 +08:00
unset($array[1]) 后,就变成 key=>value 了,

unset 后调用一次 $array = array_values($array);

json 通信基本问题啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/283405

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX