如何递归遍历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);
代码说明
- 引用传递$result:确保递归过程中所有层级的操作都修改同一个结果数组,避免数据丢失或重复创建。
- $currentPath参数:记录从顶级到当前元素的完整键路径,每进入一层子数组就拼接当前键。
- $topKey参数:锁定当前元素所属的顶级键,保证所有子路径都归类到正确的分组下。
- 非数组元素处理:遇到非数组值时,直接将拼接好的完整路径添加到对应顶级键的数组中。
运行上述代码后,输出结果将与期望完全一致。
内容的提问来源于stack exchange,提问作者Zubair Ahmd
相关产品推荐
相关产品推荐

