You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过通配符路径为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:57:04