最近在用 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
呢?
1
fising 2016-06-04 10:10:48 +08:00 via iPhone
你写的这到底是 php 还是 js
|
2
msg7086 2016-06-04 10:15:17 +08:00
|
3
msg7086 2016-06-04 10:17:23 +08:00 1
PHP 里的 Array 对数组和哈希表的区分并没有明确的界限。
你删掉第二个元素以后,这个 Array 就不是数组而是哈希表了。 [1, 2, 3] 删掉第二个元素以后就变成了 [0=>1, 2=>3]。 |
4
lynnworld 2016-06-04 10:20:06 +08:00 1
php 里面 array 既可以是数组又可以是 hash,在 json 序列化的时候,如果 index 不是从 0 开始连续的数字就认为是 hash ,序列化成{} 对象了。你 unset 之后可以使用 array_merge 帮你重新排一下下标。
|
5
500miles 2016-06-04 11:01:24 +08:00 1
没错儿, 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}" |
7
void1900 2016-06-04 11:59:14 +08:00
unset($array[1]) 后,就变成 key=>value 了,
unset 后调用一次 $array = array_values($array); json 通信基本问题啊 |