如何通过通配符路径为PHP多维数组的指定索引批量赋值
PHP多维数组指定路径批量赋值实现方案
核心逻辑
我们通过路径拆分+递归遍历的方式实现需求,核心处理逻辑如下:
- 将传入的点分隔路径规则拆分为层级键数组
- 递归匹配数组层级:遇到
*通配符时遍历当前层级所有子键,普通键则直接匹配对应索引 - 匹配到路径最后一级时直接完成赋值
完整实现代码
function defineNewValues(&$arr, $keys) { // 遍历所有待赋值的路径规则 foreach ($keys as $path => $value) { $pathParts = explode('.', $path); // 递归处理赋值 $recursiveAssign = function(&$currentArr, $depth) use (&$recursiveAssign, $pathParts, $value) { $partCount = count($pathParts); // 已经到最后一级,执行赋值 if ($depth === $partCount - 1) { $currentKey = $pathParts[$depth]; if ($currentKey === '*') { // 通配符匹配所有键赋值 foreach ($currentArr as &$item) { $item = $value; } } else { // 普通键直接赋值,不存在则自动创建 $currentArr[$currentKey] = $value; } return; } // 未到最后一级,继续向下递归 $currentKey = $pathParts[$depth]; if ($currentKey === '*') { // 遍历当前层级所有子元素递归 foreach ($currentArr as &$subArr) { if (is_array($subArr)) { $recursiveAssign($subArr, $depth + 1); } } } else { // 普通键不存在则自动创建数组 if (!isset($currentArr[$currentKey]) || !is_array($currentArr[$currentKey])) { $currentArr[$currentKey] = []; } $recursiveAssign($currentArr[$currentKey], $depth + 1); } }; $recursiveAssign($arr, 0); } }
使用示例
// 测试用的多维数组 $myArray = [ 'data' => [ [ 'checkin' => '2024-01-01', 'checkout' => '2024-01-02', 'content' => [ ['price' => 100, 'profit' => 20, 'exchangerate' => 7.2], ['price' => 200, 'profit' => 50, 'exchangerate' => 7.3] ] ], [ 'checkin' => '2024-01-03', 'checkout' => '2024-01-04', 'content' => [ ['price' => 150, 'profit' => 30, 'exchangerate' => 7.2] ] ] ] ]; // 调用函数批量赋值 defineNewValues($myArray, [ 'data.*.content.*.price' => 0, 'data.*.content.*.profit' => 0, ]); // 输出验证结果 print_r($myArray);
执行后data下所有子项的content里所有子项的price和profit都会被修改为0,其余字段保持原值不变。
可选优化说明
如果不需要自动创建不存在的路径,可以删除代码中自动创建数组的逻辑,只对已存在的路径执行赋值即可。
内容的提问来源于stack exchange,提问作者Eyal Biton
相关产品推荐
相关产品推荐

