如何通过括号分隔的键路径字符串更新PHP多维关联数组指定值
实现方案
核心思路是先从$pattern中提取所有层级的键名,再通过引用传递逐层定位到数组的目标节点,最终完成赋值。
完整代码实现
<?php // 示例初始数组 $array = [ 'store_name' => 'Jota', 'social' => [ 'fb' => 'foo' ] ]; $pattern = "[social][fb];"; $value = "bar"; // 1. 提取pattern中的所有键名 preg_match_all('/\[([^\]]+)\]/', $pattern, $matches); $keys = $matches[1]; // 得到键名数组:['social', 'fb'] // 2. 用引用逐层定位 $current = &$array; foreach ($keys as $key) { // 如果当前层级不存在该键,自动创建空数组(可选,按需开启) if (!isset($current[$key])) { $current[$key] = []; } $current = &$current[$key]; } // 3. 赋值更新 $current = $value; // 销毁引用,避免后续意外修改 unset($current); // 打印验证结果 print_r($array); ?>
代码说明
- 正则
/\[([^\]]+)\]/会匹配所有被方括号包裹的内容,自动过滤掉末尾的分号等无效字符 - 使用引用
&操作数组,不需要递归遍历,性能更高 - 自动补全不存在层级的逻辑可以根据业务需求关闭,如果要求必须严格匹配已存在的键,删除自动创建的判断即可,匹配不到会抛出Notice提示。
内容的提问来源于stack exchange,提问作者SkyRar
相关产品推荐
相关产品推荐

