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

大佬们 问个 PHP 动态修改多维数组的问题

  •  
  •   qwertyzzz · 2021-08-18 14:31:41 +08:00 · 2305 次点击
    这是一个创建于 1198 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $a=[1,2,3,4]
    
    $b=[
    	1=>[
        	2=>[
            	3=>[
            		4=>[]
                ]
            ]
        ]
        
       ]
    

    我如何通过 a,b 给 4 里面加一个值 5,a 的个数可能会变 但是不会超过 b 不考虑 a 里面的超过了 b,反正就是动态的那种

    16 条回复    2021-08-20 18:06:44 +08:00
    AoEiuV020
        1
    AoEiuV020  
       2021-08-18 14:39:47 +08:00
    嗯。。。没看明白,要不格式化一下,再把添加之后的数组写出来看看,
    buxudashi
        2
    buxudashi  
       2021-08-18 14:42:45 +08:00   ❤️ 1
    你这是从数据库里读出来要弄树形结构吧。分销用?
    yEhwG10ZJa83067x
        3
    yEhwG10ZJa83067x  
       2021-08-18 14:47:48 +08:00
    再说的详细点看
    第一段我就没有看明白要干什么
    “我如何通过 a,b 给 4 里面加一个值 5,”
    qwertyzzz
        4
    qwertyzzz  
    OP
       2021-08-18 15:00:35 +08:00
    @buxudashi 对差不多 不过不是分销 就多层
    @AoEiuV020 @justrand 额 就是 $a=[1,2,3] $b['1']['2']['3']........ 不晓得能明白不
    2kCS5c0b0ITXE5k2
        5
    2kCS5c0b0ITXE5k2  
       2021-08-18 15:13:12 +08:00
    hash 表?
    JKeita
        6
    JKeita  
       2021-08-18 15:16:29 +08:00
    看不懂题目说什么,a 和 b 有啥关系。
    JKeita
        7
    JKeita  
       2021-08-18 15:22:13 +08:00
    $a=[1,2,3,4];

    $b=[
    1=>[
    2=>[
    3=>[
    4=>[]
    ]
    ]
    ]
    ];

    $arr = &$b;
    foreach($a as $v){
    $arr = &$arr[$v];
    }
    $arr[$v+1]=[];
    echo json_encode($b);
    die;
    这样?
    jhdxr
        8
    jhdxr  
       2021-08-18 15:23:43 +08:00
    简而言之,做不到。

    你无法做到修改了一个数组后自动修改另外一个数组的值或结构(引用除外,但引用本质上两个数组或者数组的一部分得是相同的,不符合你这个场景)

    但也许你可以写一个函数,输入是 a,输出是你想要的 b
    qwertyzzz
        9
    qwertyzzz  
    OP
       2021-08-18 15:34:52 +08:00
    @JKeita 数组访问 不是中括号嘛 二维数组 不是 2 个中括号嘛 现在我不清楚是几维 所以维度是动态的 那么我$b 后面跟的[]就是多个 假设键值都在$a=[1,2,3]这个数组里 这边 1 2 3 是键 那我就是想修改$b[1][2][3],如果$a=[1,2,3,4].那就是修改$b[1][2][3][4] 就这个意思吧 不晓得能不能
    JKeita
        10
    JKeita  
       2021-08-18 15:39:59 +08:00
    @qwertyzzz 所以使用引用啊
    JKeita
        11
    JKeita  
       2021-08-18 15:41:17 +08:00
    @qwertyzzz 因为 a 和 b 层级对应,那就是遍历 a 获取 b 下个层级引用。
    AoEiuV020
        12
    AoEiuV020  
       2021-08-18 15:50:20 +08:00
    @qwertyzzz 好像有点懂了,现在已知$a=[1,2,3,4];
    想通过 a 得到定位到数组 b 上$b[1][2][3][4]这个节点上,
    如果 a 是[9,5,2,7]就表示想读写 b[9][5][2][7], 是这样的吧,

    你这里是把数组当链表用了,那么读取也得按链表来了,简单说就是循环,
    那这 7 楼没毛病啊,

    <?php
    $a=[1,2,3,4];
    $b=[ 1=>[ 2=>[ 3=>[ 4=>[] ] ] ] ];

    $ret = &$b;
    foreach($a as $v){
    $ret = &$ret[$v];
    }

    $ret[5] = "hello";
    print_r($b);
    klgd
        13
    klgd  
       2021-08-18 15:52:58 +08:00
    https://3v4l.org/TBLt5
    是这样吗?
    wispx
        14
    wispx  
       2021-08-18 16:04:04 +08:00
    https://implode.io/y9evv9

    思路:先按键名将数组倒序,利用 PHP 的 array_reduce 函数,每次回调都可以拿到上次回调回调所返回的值,每次回调利用上次的值创建新的数组,说人话就是每次回调都将上次的值于本次回调的值合并成一个数组并返回供下一个回调处理(好像有点拗口
    hejw19970413
        15
    hejw19970413  
       2021-08-19 16:51:36 +08:00
    取地址 修改
    windychen0
        16
    windychen0  
       2021-08-20 18:06:44 +08:00
    let a = [3,4,5]; let b = {"3": {"4": { "5": 666}}}

    function getDeep(arr = [],map = {}){
    return arr.length ? getDeep(arr,map[arr.shift()]) : map;
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5390 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:11 · PVG 16:11 · LAX 00:11 · JFK 03:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.