my101du
V2EX  ›  问与答

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

  •  
  •   my101du · Jun 4, 2016 · 3222 views
    This topic created in 3660 days ago, the information mentioned may be changed or developed.

    最近在用 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呢?

    7 replies    2016-06-04 11:59:14 +08:00
    fising
        1
    fising  
       Jun 4, 2016 via iPhone
    你写的这到底是 php 还是 js
    msg7086
        3
    msg7086  
       Jun 4, 2016   ❤️ 1
    PHP 里的 Array 对数组和哈希表的区分并没有明确的界限。
    你删掉第二个元素以后,这个 Array 就不是数组而是哈希表了。
    [1, 2, 3] 删掉第二个元素以后就变成了 [0=>1, 2=>3]。
    lynnworld
        4
    lynnworld  
       Jun 4, 2016   ❤️ 1
    php 里面 array 既可以是数组又可以是 hash,在 json 序列化的时候,如果 index 不是从 0 开始连续的数字就认为是 hash ,序列化成{} 对象了。你 unset 之后可以使用 array_merge 帮你重新排一下下标。
    500miles
        5
    500miles  
       Jun 4, 2016   ❤️ 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}"
    my101du
        6
    my101du  
    OP
       Jun 4, 2016
    @msg7086
    @lynnworld 非常感谢两位的解答,明白了。 我对这些深入的东西了解太少了
    void1900
        7
    void1900  
       Jun 4, 2016
    unset($array[1]) 后,就变成 key=>value 了,

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

    json 通信基本问题啊
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5417 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 395ms · UTC 03:37 · PVG 11:37 · LAX 20:37 · JFK 23:37
    ♥ Do have faith in what you're doing.