V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HackerJax
V2EX  ›  PHP

PHP 最恶心的地方莫过于数组明明是一个 list,一些操作,比如 filter, unset, unique 去重等操作后, index 不会 reset,转 json 后变成了一个 object!

  •  1
     
  •   HackerJax · 2023-09-12 12:53:55 +08:00 · 4473 次点击
    这是一个创建于 469 天前的主题,其中的信息可能已经有所发展或是发生改变。
    op 表示深受其害!(狗头
    第 1 条附言  ·  2023-09-13 14:14:04 +08:00
    发帖只是图一乐,生活本来就很无聊!
    我只是个 crud boy ~~
    感谢 php 让我从资本家手里拿到工资!
    57 条回复    2023-10-20 23:48:38 +08:00
    darklinden
        1
    darklinden  
       2023-09-12 12:57:44 +08:00   ❤️ 12
    能意识到 list 和 object 的区别,这一点已经比很多 phper 强了(狗头
    neutrino
        2
    neutrino  
       2023-09-12 13:13:50 +08:00 via Android
    index reset 了也有问题,原来的 index 不能用了
    fuchish112
        3
    fuchish112  
       2023-09-12 13:18:43 +08:00
    array_values 一下
    zjsxwc
        4
    zjsxwc  
       2023-09-12 13:21:14 +08:00   ❤️ 2
    还不是为了兼容你在
    ```
    foreach ($arr as $k=>$v) { ... unset($arr[$k]); ... }
    ```
    里这种写法,如果 unset 后 index 会 reset ,那么后面的循环$k 会乱套。
    justfindu
        5
    justfindu  
       2023-09-12 13:24:58 +08:00
    啊 深受其害就要骂它没有为你专人定制吗?
    miaotaizi
        6
    miaotaizi  
       2023-09-12 13:32:30 +08:00
    多研究, 少抱怨
    veike
        7
    veike  
       2023-09-12 13:42:33 +08:00
    最恶心的不是美元符号 和 -> ?
    ganbuliao
        8
    ganbuliao  
       2023-09-12 13:52:21 +08:00
    php 的数组其实是 object list 是用 object 模拟的 学的时候很爽 但是你用其他语言的数组理解使用的时候 会有一些苦恼吧
    tbv
        9
    tbv  
       2023-09-12 14:04:19 +08:00   ❤️ 6
    不要张嘴就恶心,你写一个比他好的,或者提出你更好的解决方案,你也可以去提交 PR https://github.com/php/php-src
    cwcc
        10
    cwcc  
       2023-09-12 14:05:34 +08:00
    这是优势啊,各种处理方式都有,可以保留 key ,也可以不保留 key 。主要是 array 相关的内置方法确实多,然后所有有关数组、字典的东西都揉进去变成数组,如果不是只接触 PHP ,还要同时写别的语言,一开始可能会感觉有点坑。但时间长了还好,只能说是 PHP 太灵活了,能把 PHP 写得很好很优雅的人也很少。
    crynocry
        11
    crynocry  
       2023-09-12 14:12:51 +08:00
    有 ds 扩展里面有 Vector 和 Map 还有各种细分数据结构 .. 看你愿不愿意用了
    MrUser
        12
    MrUser  
       2023-09-12 14:17:35 +08:00   ❤️ 1
    这句 [转 json 后变成了一个 object] ,应该是变成了 json 字符串吧?
    json_decode 方法的第二个参数可以控制「 json 字符串」是转成 array 还是 object 。
    在 php 里 object 和 array 的 “index” 都可以是数字
    d3js
        13
    d3js  
       2023-09-12 14:28:28 +08:00
    哈哈,好久没看到 PHP 的帖子了
    kkk9
        14
    kkk9  
       2023-09-12 14:30:45 +08:00
    @veike #7 那 . 和 => 不恶心吗?(滑稽)
    z1829909
        15
    z1829909  
       2023-09-12 14:35:55 +08:00
    php 的数组本来就区分索引数组和关联数组,. 通过 unset, filter, unique 之类的方法破坏了数组连贯性之后就自动变为关联数组了.虽然这么设计有点实用主义, 但是最起码看下怎么用的再喷吧.
    brader
        16
    brader  
       2023-09-12 14:40:28 +08:00
    虽然我不研究这几个函数的底层,但是有没有可能是官方出于性能考虑而不 reset 来增加开销?因为很多时候不需要 reset 的使用场景,而需要的时候,又有内置的 array 系列函数可供使用
    zilan2abv
        17
    zilan2abv  
       2023-09-12 14:43:29 +08:00
    @darklinden php 就是创造了 array 这一种类型,把 list 和 object 糅合在一起,怎么区分我不管,好用就行了 🐶
    coderzhangsan
        18
    coderzhangsan  
       2023-09-12 14:54:19 +08:00
    这恰恰说明,你对 php 数组底层实现不了解,可以去看看 php 内核剖析数组篇;当然你还可以用 php 内置 SPL 数据结构类实现你的需求。
    yunye
        19
    yunye  
       2023-09-12 15:05:53 +08:00   ❤️ 3
    还以为又有什么高论
    lifeintools
        20
    lifeintools  
       2023-09-12 15:07:44 +08:00
    多研究,少抱怨。自己菜别怪语言
    lscho
        21
    lscho  
       2023-09-12 15:16:20 +08:00
    能意识到 list 和 object ,但是却不愿意看一下 json_encode 的文档?

    https://www.php.net/manual/en/function.json-encode.php

    第二个参数干什么用的?
    well775397252
        22
    well775397252  
       2023-09-12 15:32:06 +08:00
    ?我倒觉得符合逻辑,数组本来就是 hash table 实现的
    darkengine
        23
    darkengine  
       2023-09-12 15:35:25 +08:00   ❤️ 2
    我们公司的半桶水 phper 就这么给前端返回数据的,某个字段有数据的时候是数组,没有数据的时候是{},丢
    x86
        24
    x86  
       2023-09-12 15:37:24 +08:00
    可能爽的时候你没看到。。。
    aababc
        25
    aababc  
       2023-09-12 15:38:30 +08:00
    @lscho 这个和第二个参数没有关系,主要是 PHP 的没有纯数组这个概念,所以当数据的 key 一旦不连续,json_encode 的时候就会有问题
    qeqv
        26
    qeqv  
       2023-09-12 15:49:29 +08:00
    @darkengine 空数组用 json_encode 默认不就是是 [] 吗
    qeqv
        27
    qeqv  
       2023-09-12 15:51:40 +08:00
    array_values
    gym345600
        28
    gym345600  
       2023-09-12 15:51:42 +08:00
    套用一个公式:如查你觉得不好,可以改善它啊
    NjcyNzMzNDQ3
        29
    NjcyNzMzNDQ3  
       2023-09-12 16:05:56 +08:00
    借用下 20 楼的话`还以为又有什么高论`

    没 filter ,unset ,unique 你这些前辈写的好用函数,你都要自己写呢,那时候出问题看你赖谁 🐶
    mrpzx001
        30
    mrpzx001  
       2023-09-12 16:33:21 +08:00
    水平不够怪语言
    angryPHP
        31
    angryPHP  
       2023-09-12 16:57:21 +08:00
    什么?还有人用 PHP ?
    duan602728596
        32
    duan602728596  
       2023-09-12 16:59:28 +08:00
    所以说大家都选择了更好的
    darkengine
        33
    darkengine  
       2023-09-12 17:04:06 +08:00
    @qeqv 包了一个查数据库的函数的返回值组装起来,不知道具体他代码咋写的
    sdwgyzyxy
        34
    sdwgyzyxy  
       2023-09-12 17:04:10 +08:00
    😂 终于见到同僚了,我以为 php 从 v2 绝迹了。
    wu00
        35
    wu00  
       2023-09-12 17:33:02 +08:00
    @darkengine 对接过第三方平台的开放接口,就是这种情况,当时把我恶心坏了...
    SwimmingDragon
        36
    SwimmingDragon  
       2023-09-12 17:33:04 +08:00
    如果是必须要用,那就好好研究,就算有点瑕疵,也可以自己优化。如果非必须,那你还用了干嘛?换一个自己熟悉的呗
    flyqie
        37
    flyqie  
       2023-09-12 17:48:30 +08:00 via Android
    @darkengine #23

    奇怪,刚才试了下,貌似 php7.4.27 默认 array()做 json_encode 之后就是[],你们 php 不会直接用 object 了吧。
    xiangyuecn
        38
    xiangyuecn  
       2023-09-12 17:49:49 +08:00
    上古时期的 asp+vbscript 的引用类型的数组 比 php 的值类型的数组好使😂

    asp+jsscript 简直要吊打当代任何弱类型语言(比 nodejs 领先 20 年),可惜已经凉透了😂
    darkengine
        39
    darkengine  
       2023-09-12 17:55:36 +08:00
    @flyqie 很有可能,我记得他们用的还是 ThinkPHP 5 ,工具扫出来一堆漏洞,笑死
    heysnakelis
        40
    heysnakelis  
       2023-09-12 17:59:56 +08:00
    @darkengine 估计查到数据是返回的数组,没查到数据的时候给的空 object😂
    xiaoqi
        41
    xiaoqi  
       2023-09-12 18:06:40 +08:00
    那就手动 reset 一下咯
    shawn4me
        42
    shawn4me  
       2023-09-12 18:12:11 +08:00
    咱就是说,有没有那么一丝丝的可能,是你太菜,这种问题的解决方法有很多,而你一个都没找,直接骂到了语言层面,这不合适吧。。。
    adoal
        43
    adoal  
       2023-09-12 18:27:18 +08:00
    吐槽 PHP->理解 PHP->热爱 PHP->颠覆 PHP
    stabc
        44
    stabc  
       2023-09-12 18:31:51 +08:00
    json_encode 有第二个参数的。PHP 强大到你无法想象
    lscho
        45
    lscho  
       2023-09-12 19:24:30 +08:00
    @aababc 谁说 php 没有纯数组啊。。。php 数组分为索引数组(就是你说的纯数组)和关联数组,类似别的语言的 list 和 map ,只不过 php 属于动态类型,索引数组在破坏连续性或指定键的时候,会自动转换为关联数组。。。感觉你们都不看文档啊

    https://www.php.net/manual/zh/language.types.array.php
    akira
        46
    akira  
       2023-09-12 19:43:47 +08:00
    不错不错,居然还有人再用 php
    Seanfuck
        47
    Seanfuck  
       2023-09-12 21:08:28 +08:00
    go 的空数组转 json 也不按套路来啊
    ruoge3s
        48
    ruoge3s  
       2023-09-13 09:29:16 +08:00
    @Seanfuck 那不是空数组,那是未初始化的变量...
    zhuzhibin
        49
    zhuzhibin  
       2023-09-13 09:45:16 +08:00 via iPhone
    快跑 竟然还有人用 php
    aababc
        50
    aababc  
       2023-09-13 09:55:10 +08:00
    @lscho 总的来说在 php 中 array 和 map 共用了同一个实现,没有办法彻底分离 array 和 map 这两个概念。
    jameskongawork
        51
    jameskongawork  
       2023-09-13 11:49:32 +08:00
    @tokeytush 我先替楼主回你:"鸡蛋不好吃难道我要下蛋吗“
    xbchaonba
        52
    xbchaonba  
       2023-09-13 15:30:24 +08:00
    你不会是不知道 json_decode 可以传第二个参数吧,你传个 true 返回的就是数组啊
    realpg
        53
    realpg  
       2023-09-13 19:35:14 +08:00
    @brader #16
    不是性能考虑
    是实用考虑
    php 你可以在 foreach 遍历数组内部 unset 一个元素
    realpg
        54
    realpg  
       2023-09-13 19:37:07 +08:00
    @darkengine #39
    可别提工具扫出来了
    珍爱生命远离漏扫

    前前前公司被全省通报批评,拒不整改漏洞

    因为当时 nginx 版本最新是 1.22
    然后 1.22 爆出了漏洞,爆出的时候已经有官方补丁修复了,版本号是没变的
    但是漏扫只要看到 nginx 1.22 就报你有漏洞
    yKXSkKoR8I1RcxaS
        55
    yKXSkKoR8I1RcxaS  
       2023-09-23 16:38:22 +08:00
    人菜怪工具
    fincci
        56
    fincci  
       2023-09-27 08:51:25 +08:00
    真是布袋和尚说不得,php 的数组根本就不是 list ,就是 map 而已,所谓的索引数组在 php 里面就是个笑话,一不小心就要转变为关联数组了
    本来就是设计问题,跟人菜不菜没有任何关系,每当操作索引数组的时候都得小心翼翼,要不就是只能用 push/pop ,array_slice 几个很有限函数来操作,或者用 filter ,unset 之类的搞完之后用 array_values 转一下,问题是能解决,但是心智负担还是很重,代码也很丑陋
    ZoR
        57
    ZoR  
       2023-10-20 23:48:38 +08:00
    啊这 建议多看手册,这是个 phper 都知道的吧,那种半吊子的 你换别的语言他也会吐槽的 哈哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3478 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:40 · PVG 12:40 · LAX 20:40 · JFK 23:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.