$a=[1,2,3,4]
$b=[
1=>[
2=>[
3=>[
4=>[]
]
]
]
]
我如何通过 a,b 给 4 里面加一个值 5,a 的个数可能会变 但是不会超过 b 不考虑 a 里面的超过了 b,反正就是动态的那种
1
AoEiuV020 2021-08-18 14:39:47 +08:00
嗯。。。没看明白,要不格式化一下,再把添加之后的数组写出来看看,
|
2
buxudashi 2021-08-18 14:42:45 +08:00 1
你这是从数据库里读出来要弄树形结构吧。分销用?
|
3
yEhwG10ZJa83067x 2021-08-18 14:47:48 +08:00
再说的详细点看
第一段我就没有看明白要干什么 “我如何通过 a,b 给 4 里面加一个值 5,” |
4
qwertyzzz OP |
5
2kCS5c0b0ITXE5k2 2021-08-18 15:13:12 +08:00
hash 表?
|
6
JKeita 2021-08-18 15:16:29 +08:00
看不懂题目说什么,a 和 b 有啥关系。
|
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; 这样? |
8
jhdxr 2021-08-18 15:23:43 +08:00
简而言之,做不到。
你无法做到修改了一个数组后自动修改另外一个数组的值或结构(引用除外,但引用本质上两个数组或者数组的一部分得是相同的,不符合你这个场景) 但也许你可以写一个函数,输入是 a,输出是你想要的 b |
9
qwertyzzz OP @JKeita 数组访问 不是中括号嘛 二维数组 不是 2 个中括号嘛 现在我不清楚是几维 所以维度是动态的 那么我$b 后面跟的[]就是多个 假设键值都在$a=[1,2,3]这个数组里 这边 1 2 3 是键 那我就是想修改$b[1][2][3],如果$a=[1,2,3,4].那就是修改$b[1][2][3][4] 就这个意思吧 不晓得能不能
|
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); |
13
klgd 2021-08-18 15:52:58 +08:00
https://3v4l.org/TBLt5
是这样吗? |
14
wispx 2021-08-18 16:04:04 +08:00
https://implode.io/y9evv9
思路:先按键名将数组倒序,利用 PHP 的 array_reduce 函数,每次回调都可以拿到上次回调回调所返回的值,每次回调利用上次的值创建新的数组,说人话就是每次回调都将上次的值于本次回调的值合并成一个数组并返回供下一个回调处理(好像有点拗口 |
15
hejw19970413 2021-08-19 16:51:36 +08:00
取地址 修改
|
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; } |