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

如何递归遍历PHP多维关联数组并生成键路径字符串数组?

递归遍历PHP多维关联数组生成带完整父级键路径的数组

输入数组

$user = [
    'profile' => [
        'authkey' => '',
        'publickey' => '',
        'status' => 19
    ],
    'setup' => [
        'profile' => false,
        'contact' => false,
        'payments' => false,
        'subscription' => false
    ],
    'paygateway' => [
        'paypal' => [
            'publickey' =>'',
            'secretkey' => '',
            'testarray' => [
                'key1' => 'value1',
                'key2' => 'value2',
                'key3' => [
                    'key4' => 'level4'
                ]
            ],
            'webhookid' => ''
        ],    
        'stripe' => [
            'publickey' => '',
            'secretkey' => ''
        ]
    ]
];

期望输出

array (
  'profile' => 
  array (
    0 => '[profile][authkey]',
    1 => '[profile][publickey]',
    2 => '[profile][status]',
  ),
  'setup' => 
  array (
    0 => '[setup][profile]',
    1 => '[setup][contact]',
    2 => '[setup][payments]',
    3 => '[setup][subscription]',
  ),
  'paygateway' => 
  array (
    0 => '[paygateway][paypal][publickey]',
    1 => '[paygateway][paypal][secretkey]',
    2 => '[paygateway][paypal][testarray][key1]',
    3 => '[paygateway][paypal][testarray][key2]',
    4 => '[paygateway][paypal][testarray][key3][key4]',
    5 => '[paygateway][paypal][webhookid]',
    6 => '[paygateway][stripe][publickey]',
    7 => '[paygateway][stripe][secretkey]',
  ),
)

现有递归遍历代码

function testArray($array){
    
    foreach($array as $key => $value){
        
        if(is_array($value)){
            echo "$key <br/>";
            testArray($value);
        }else{
            echo "$key : $value <br/>";
        }   
        
    }
}
testArray($user);

解决方案

要实现目标,核心是跟踪当前遍历的键路径,并在遇到非数组元素时,将完整路径按顶级键分组存入结果数组。可以通过引用传递结果数组,递归时传递当前路径来实现:

function buildKeyPaths($array, $currentPath = '', &$result = [], $topKey = null) {
    foreach ($array as $key => $value) {
        // 拼接当前层级的键路径
        $newPath = $currentPath . "[$key]";
        // 记录当前元素所属的顶级键,用于分组
        $currentTopKey = $topKey ?? $key;

        if (is_array($value)) {
            // 递归遍历子数组,传递更新后的路径和顶级键
            buildKeyPaths($value, $newPath, $result, $currentTopKey);
        } else {
            // 非数组元素,将完整路径存入对应顶级键的分组
            $result[$currentTopKey][] = $newPath;
        }
    }
}

// 初始化结果数组
$keyPaths = [];
// 调用生成路径的函数
buildKeyPaths($user, '', $keyPaths);

// 输出最终结果
print_r($keyPaths);

代码说明

  1. 引用传递$result:确保递归过程中所有层级的操作都修改同一个结果数组,避免数据丢失或重复创建。
  2. $currentPath参数:记录从顶级到当前元素的完整键路径,每进入一层子数组就拼接当前键。
  3. $topKey参数:锁定当前元素所属的顶级键,保证所有子路径都归类到正确的分组下。
  4. 非数组元素处理:遇到非数组值时,直接将拼接好的完整路径添加到对应顶级键的数组中。

运行上述代码后,输出结果将与期望完全一致。

内容的提问来源于stack exchange,提问作者Zubair Ahmd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:35:36