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

2021-08-18 14:31:41 +08:00
 qwertyzzz
$a=[1,2,3,4]

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

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

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

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

但也许你可以写一个函数,输入是 a,输出是你想要的 b
qwertyzzz
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
2021-08-18 15:39:59 +08:00
@qwertyzzz 所以使用引用啊
JKeita
2021-08-18 15:41:17 +08:00
@qwertyzzz 因为 a 和 b 层级对应,那就是遍历 a 获取 b 下个层级引用。
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
2021-08-18 15:52:58 +08:00
https://3v4l.org/TBLt5
是这样吗?
wispx
2021-08-18 16:04:04 +08:00
https://implode.io/y9evv9

思路:先按键名将数组倒序,利用 PHP 的 array_reduce 函数,每次回调都可以拿到上次回调回调所返回的值,每次回调利用上次的值创建新的数组,说人话就是每次回调都将上次的值于本次回调的值合并成一个数组并返回供下一个回调处理(好像有点拗口
hejw19970413
2021-08-19 16:51:36 +08:00
取地址 修改
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;
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/796542

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX