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

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

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

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

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

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

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

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

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

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

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